试题 算法提高 连接乘积

问题:
192这个数很厉害,用它分别乘以1、2、3,会得到:
  192 x 1 = 192
  192 x 2 = 384
  192 x 3 = 576
  把这三个乘积连起来,得到192384576,正好是一个1~9的全排列
  我们把上面的运算定义为连接乘积:
  m x (1 … n) = k(其中m > 0 且 n > 1,对于上例,m = 192、n = 3、k = 192384576)
  即k是把m分别乘以1到n的乘积连接起来得到的,则称k为m和n的连接乘积。
  按字典序输出所有不同的连接乘积k,满足k是1~9的全排列。

解决:由题意大致推出,0<m<9999,1<n<10,于是就用两个for循环进行一个个尝试…我是真的不想用二维数组排序…于是参考了
他的C++写的…

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include <algorithm> 
#include <iostream>
#include <vector>
using namespace std;
vector<string> Str3;
bool NoRepeat(char str[]);

int main()
{
    
    
 char str1[5];                            //临时保存乘之后的结果数字;
 char str2[20];                           //将临时的数字连接在一起;
 memset(str1, 0, sizeof(str1));
 memset(str2, 0, sizeof(str2));
 int i, j;
 for(i = 1; i<9999; i++)
 {
    
    
  for(j = 1; j<10; j++)
  {
    
    
   itoa(i*j, str1, 10);
   strcat(str2, str1);
   if(strlen(str2)>9)
   {
    
    
    memset(str2, 0, sizeof(str2));
    break;
   }
   if(strlen(str2)==9)
   {
    
    
    if(NoRepeat(str2))
    {
    
    
     Str3.push_back(str2);
     memset(str2, 0, sizeof(str2));
     break;
    }
   }
  }
 }
 sort(Str3.begin(),Str3.end());        //排序
 for(i=0; i<Str3.size(); i++)
  cout<<Str3[i]<<endl;
 return 0;
}

bool NoRepeat(char str[])     //判断重复及0。
{
    
    
 int i = 0;
 int j = 0;
 int flag = true;
 for(i = 0; i<8; i++)
 {
    
    
  for(j = i+1; j<9; j++)
  {
    
    
   if(str[i]==str[j])
   {
    
    
    flag = false;
    break;
   }
  }
  if(flag ==false)
  {
    
    
   break;
  }
 }
 if(flag==true)
 {
    
    
  for(i = 0; i<9; i++)
  {
    
    
   if(str[i]=='0')
   {
    
    
    flag = false;
    break;
   }
  }
 }
 return flag ;
}












猜你喜欢

转载自blog.csdn.net/Aurora____/article/details/105279967
今日推荐