竖式问题

image.png

竖式问题_第1张图片
image.png

分析:

要求两个乘数,两个中间结果和最终结果包含的数字都包含在输入的数字集中。

  • 输入数字集char s[99]
  • 需检验的数字经sprintf转换存入char buff[99]
  • 使用 char *strchr(const char *str, int c)判断buff中的每个字符是否包含在s中
  • 如果都包含则格式化打印
#include 
#include 
#include 
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\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;
}

结果


竖式问题_第2张图片
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: "<

结果:


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;

你可能感兴趣的:(竖式问题)