算法入门\简单模拟\竖式问题
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;
}
相关文章推荐
- zoj1494 暴力模拟 简单数学问题
- java多线程之生产者与消费者问题的简单模拟
- 高精度问题之大数相加(原来就是用字符串相加,模拟手算这么简单!)
- java多线程之生产者与消费者问题的简单模拟
- 哈理工OJ 1031 _OOOO_ Problem(简单模拟问题)
- 使用ReentrantLock模拟简单生产者和消费者问题
- hdu - 1276 士兵队列训练问题 - 简单模拟
- NYOJ 题目77 开灯问题(简单模拟)
- 开灯问题---------简单模拟
- 开灯问题 简单模拟法
- 4000 洛谷 P1190 接水问题(简单模拟)
- wait, notify, notifyAll, 简单数组模拟队列实现读者写者问题。
- [Java]命令行模拟TCP客户端与服务端的简单小程序遇到的问题(基础不牢!扎实和亲手实践比什么都重要!)
- 使用Redis模拟简单分布式锁,解决单点故障的问题
- 问题 C: 序列求平均(简单模拟)
- 统计工龄 模拟EXCEL排序 银行排队问题之单队列多窗口问题 银行业务队列简单模拟 堆栈操作合法性 两个有序序列的中位数
- C语言 竖式问题 模拟竖式
- 使用C++TR1实现物流配送问题的简单模拟
- 问题 A: 第几天(简单模拟)
- 使用Redis模拟简单分布式锁,解决单点故障的问题