竖式问题

2020-01-29  本文已影响0人  茶酒qqq
image.png
image.png

分析:

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

#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;

上一篇下一篇

猜你喜欢

热点阅读