您的位置:首页 > 其它

算法入门\简单模拟\竖式问题

2018-03-19 22:37 369 查看

竖式问题

题目(自述):

一开始,我连题目都没看懂。。啧啧,后来研究了一下输出,才晓得。大概是这样的(我就不copy原题目了,浪费笔油,hhhhhhhh)输入:一串数字处理:找三位数乘以两位数(abc*de),在做乘法运算的时候涉及到的数字即为输入的那一串数字,如
     775
  x   33
————————
    2325
+ 2325
________
   25575        //你看,2357包含了这个竖式所含的所有数字

自我分析:

首先申明,我也不会呀,我就这么想想,而且先别看《自我分析》的备注。我想到我小学做乘法题,一个数字不变,另外一个数字拆成个十百分位分别与那个不变的数字相乘,然后按照个十百分位的格式相加。计算机如何做到让不同的数字个十百分位错乱的相加呢????后面的数字总是影响着前面的数字,而且影响的程度还是* 10、* 100…..的
/* 既然这么烦,当然当整型数字处理啦,当字符,天哪,我刚才是怎么想的啊*/
而且我们要做的还是在屏幕上打印,里面还穿插着字符,城会玩。
/* 既然这么烦,当然当整型数字处理啦,当字符,天哪,我刚才是怎么想的啊*/
打印就打印吧,还要打印出符合输入的所有的整式。。有趣。

伪代码

scanf("%s",s);
for(abc=111;abc<=999;abc++){
   for(de=11;de<=99;de++){
       if(abc*de符合输入的那一串数字){
           打印
           count++;
      }
   }
}
printf("The number of solutions=%d\n",count);
乍一看,这还挺简单哦~~(保持这种自信,咱们继续)

难点逐个攻破

如何判断 “ abc*de以及竖式关联的数字 ” 符合输入的那一串数字

//abc不动,拆个数少的(这样我们加的次数少一点)
x=abc*(de%10);//de的个位和abc相乘得到的数(注意,不是字符啊)
y=abc*(de/10);//de的十位和abc相乘(注意,不是字符啊)
z=abc*de;//abc和de真正的乘机(注意,不是字符啊)
// 现在去看看自我分析的备(zong)注(jie)  :)
//然后我们联系输入的数字和x,y,z之间符不符合(!!!难点,翻过这道大山就可以~~~~下山啦,噗> < )
//然后我发现一个神器,我前天还学到来着,当时记得它可以用来日期处理来着,现在又遇到它~~~缘分啊,,,噗。。笑死
//没错,它就是sprintf!!!!!!!!!!
sprintf(存放abc,dex,y,z各个数字的 字符串数组buf,"%d%d%d%d%d",abc,de,x,y,z);
//ok,我们成功将数字转化成数组,松口气喝口水,咱们~~下山去
//你一定会说,卧槽,下什么山, 咱们还没比较呢;汗,忘记跟你说strchr了
for(i=0;i<strlen(buf);i++){
   if(strchr(s,buf[i])==NULL)ok=0;
}//for循环用来一个一个字符逐一比较,如果字符串s中第一次出现buf[i]的位置是NULL,也就是空,(即字符串s中没有出现过字符buf[i]),那就不ok(ok=0);

如何打印那个竖式

//前面已经说到,ok=0就标志着 “ abc*de以及竖式关联的数字 ” 不符合输入的那一串数字
//那么我们要在之前添一个ok=1;这样我们才能把进行打印啊:)
//去看了一下参考代码,就两行,,啧啧,所以说,事情没有想象的那么难,如果有,也是自己被自己吓得。。anyway,我把自己吓得不轻,矮油-。-
if(ok){
   pintf("<%d>\n",++count);
   printf("%5d\nX%4d\n-----\n%5d\n%4d\n-----\n%5d\n\n",abc,de,x,y,z);
}

咱们一起呼~呼~两口气,啊,不对;是一口,因为咱们程序还没写完呐~~

咱们现在要做的事:步骤一:把变量和数组该定义的定义、该初始化的初始化;步骤二:把用到的库函数,该声明的声明,讲真,我感觉用到字符串,不好好利用<string.h>就是在浪费生命哦-…-步骤0:咱们先搭建程序的框架,什么循环结构啊,顺序结构啊用到的按照逻辑写好,(里面具体怎么写我们已经解决了,按照语法好好写就行,然后之间遇到的变量啊,数组啊,函数啊什么的(步骤一和二),再在前面写)

参考代码

刘汝佳老师的《算法竞赛入门经典》好书,值得推荐,等我有钱了,要买一本回来传给子孙万代,暂时先看电子版-。- >嘻嘻<
#include<stdio.h>
#include<string.h>
int main(){
 int i, ok, abc, de, x, y, z, count = 0;
 char s[20], buf[99];
 scanf("%s", s);
 for(abc = 111; abc <= 999; abc++)
   for(de = 11; de <= 99; de++) {
     x = abc*(de%10); y = abc*(de/10); z = abc*de;
     sprintf(buf, "%d%d%d%d%d", abc, de, x, y, z);
     ok = 1;
     for(i = 0; i < strlen(buf); i++)
       if(strchr(s, buf[i]) == NULL) ok = 0;
     if(ok) {
       printf("<%d>\n", ++count);
       printf("%5d\nX%4d\n-----\n%5d\n%4d\n-----\n%5d\n\n", abc, de, x, y, z);
     }
   }
 printf("The number of solutions = %d\n", count);
 return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: