频道澳门葡京手机版网址
登录注册
澳门葡京手机版网址 > 澳门葡京手机版网址 > App开发 > 其他 > 正文
竖式问题
2017-01-22 09:28:44      个评论    来源:qq_35153254的博客  
收藏   我要投稿

竖式问题:找出所有形如abc*de(三位数乘以两位数)的算式,使得在完整的竖式中,所有数字都属于一个特定的数字集合。输入数字集合(相邻数字之间没有空格),输出所有竖式。每个竖式前应有编号,之后应有一个空行。最后输出解的总数。具体格式见样例输出(为了便于观察,竖式中的空格改用小数点显示,但你的程序应该输出空格,而非小数点)。
样例输入:
2357
样例输出:

自己的蠢方法/?(? ???ω??? ?)?:
思路:二重循环,枚举所有的abc*de并逐个判断每个数字是否在数字集合中以判断竖式是否合法。

判断数字是否在数字集合中:1.用mark数组将输入的数字集合标记,mark[i]=0,代表i不属于集合,mark[i]=1,代表集合中有i,其中i取值为[0,9]。即利用了数组下标。
#include 
#include 

const int num=12;
int main(){
    char set[num];         //用于存放数字集合 
    int mark[num];         //标记数组,用于标记某数字是否是数字集合中的成员 
    memset(mark,0,sizeof(mark));  
    scanf("%s",set);
    int k=0;      //根据输入处理标记数组 
    while(set[k]!='\0'){
        mark[(int)set[k]-48]=1;           //ASCI码中数字0~9对应48~57 
        k++;
    }

    int cnt=1,x,y,z;
        for(int j=10;j<=99;j++){
            if(!mark[j/10]||!mark[j%10]) continue;    //判断两位数是否“合法”,合法是指数字均在数字集合中 
            else{
                for(int i=100;i<=999;i++){
                    if(!mark[i/100]||!mark[i%100/10]||!mark[i%10]) continue;    //判断三位数是否合法 
                    else{
                        x=i*(j%10);      //x是两位数的个位与三位数相乘结果 
                        y=i*(j/10);      //y是两位数的十位与三位数相乘结果
                        z=y*10+x;        //z是两位数与三位数相乘结果 
                        if((!mark[x/1000]||!mark[x%1000/100]||!mark[x%100/10]||!mark[x%10])  //判断xyz是否均合法 
                        ||(!mark[y/1000]||!mark[y%1000/100]||!mark[x%100/10]||!mark[x%10])
                        ||(!mark[z/10000]||!mark[z%10000/1000]||!mark[z%1000/100]||!mark[x%100/10]||!mark[x%10])) 
                           continue;
                        else       //打印 
                        printf("%c%d%c\n%5d\n%c%4d\n-----\n%5d\n%4d\n-----\n%5d\n\n",'<',cnt++,'>',i,'*',j,x,y,z);    
                    }
                }
            }
        }

    printf("The number of solutions = %d\n",cnt-1);
    return 0;
} 

注意点:

读入数字集合时以字符形式读入,在处理mark数字时,不能直接是mark[(int)set[i]],因为ASCII码中数字0~9对应48~57。 竖式中的表示数均是int型,需用【n%10^(k+1)/10^k】取出第k位(个位为0,十位为1……) 联系使用一条printf()语句输出想要的格式——理解格式化。
点击复制链接 与好友分享!回澳门葡京手机版网址澳门葡京手机版网址
上一篇:高斯消元
下一篇:用for循环语句连续读入并处理一系列图片(图片名含数字和字符)
相关文章
图文推荐

关于大家 | 联系大家 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 澳门葡京手机版网址_澳门新莆京娱乐_www.88807.com - 点此进入--致力于做实用的IT技术学习网站

XML 地图 | Sitemap 地图