image.png
分析:
要求两个乘数,两个中间结果和最终结果包含的数字都包含在输入的数字集中。
- 输入数字集
char s[99]
- 需检验的数字经sprintf转换存入
char buff[99]
- 使用
char *strchr(const char *str, int c)
判断buff中的每个字符是否包含在s中 - 如果都包含则格式化打印
#include <stdio.h>
#include <iostream>
#include <string.h>
using namespace std;
int main(){
char s[99];
memset(s,0,99);
cin>>s;
char buff[99];
memset(buff,0,99);
int count=0;
int k=1;
for(int i=100;i<=999;i++){
for(int j=10;j<=99;j++){
int x=i*(j%10);
int y=i*(j/10);
int z=i*j;
sprintf(buff,"%d%d%d%d%d",i,j,x,y,z);
for(int m=0;m<strlen(buff);m++){
if(strchr(s,buff[m])==NULL) k=0;
}
if(k==1){
count++;
printf("<%d>\n%5d\nx%4d\n-----\n%5d\n%-5d\n-----\n%d\n",count,i,j,x,y,z);
}
k=1;
}
}
printf("solution:%d",count);
return 0;
}
结果
image.png
sprintf探究
sprintf(buff,"%d%d%d%d%d",i,j,x,y,z);
我们是想把这几个int类型的每一个数字都存入char中,方便判断是否包含。
如果采用模运算,那就要做5个循环,非常麻烦。其实sprintf可以帮我们做这样的事情。
看下面的程序:
int main(){
int a=68;
char s[20];
sprintf(s,"%d",a);
cout<<"a: "<<sizeof(a)<<endl;
cout<<"s: "<<s<<endl;
cout<<"s len: "<<strlen(s)<<endl;
cout<<"s[0]: "<<s[0]<<endl;
cout<<"s[1]: "<<s[1]<<endl;
return 0;
}
结果:
image.png
s[0]=6,s[1]=8, 所以sprintf不是按照字节储存的,也就是说4个字节的int不是按照一个字节存入一个char,而是按照字符储存。
整型68
转为-->char'6'
和 '8'
因此i,j,x,y,z进行%d格式化后,直接存入buff即可。再用strchr检验每个字符。
strchr
C 库函数 char *strchr(const char *str, int c) 在参数 str 所指向的字符串中搜索第一次出现字符 c(一个无符号字符)的位置。
进行NULL判断即可知道字符是否包含在str中。
if(strchr(s,buff[m])==NULL) k=0;
网友评论