C 猜数字讲讲输入输出
题目:
用两分搜索策略来猜数字(1-100),比如程序最初猜50,让其询问用户该猜测是大还是小,如果猜测值小,那么下一次猜测值为50-100的中值。
两分法查找的思路+练习输入输出,为了作为一个游戏增强一下卖萌性所以……还是先来看看源码吧
题目:
用两分搜索策略来猜数字(1-100),比如程序最初猜50,让其询问用户该猜测是大还是小,如果猜测值小,那么下一次猜测值为50-100的中值。
两分法查找的思路+练习输入输出,为了作为一个游戏增强一下卖萌性所以……还是先来看看源码吧
经过一道杨辉三角的题,总算差不多知道了关于递归的几个问题。
- 递归里怎么看return
- 为什么说递归效率低,能不用就不用
方便阅读期间,我们直接在这里再次贴出代码:
#include <stdio.h>
int Yang(int row, int col)
{
int len = row;
if (row == 1 || col == 1 || col == len)
return 1;
if (col > len)
return 0;
return Yang(row - 1, col - 1) + Yang(row - 1, col);
}
int main(void)
{
int row, i;
scanf("%d", &row);
for (i = 1; i <= row; ++i)
printf("%d ", Yang(row, i));
printf("\n");
return 0;
}
比如 输入120,输出120 = 2 2 2 3 5
当然结果还是没有完全按照这个来输出,基本思路是实现了的。
可是最终我用的是递归,递归么……咳咳
#include <stdio.h>
int Prime(int num);
int main(void)
{
int num, array[50];
printf("请输入一个数: ");
scanf("%d", &num);
printf("%d = ", num);
Prime(num);
return 0;
}
int Prime(int num)
{
int i;
for (i = 2; i <= num; i++)
if (num % i == 0) {
printf("% d", i);
return (Prime(num / i));
}
}
题干:
输入一个数,输出对应层数的杨辉三角。
什么是杨辉三角:http://zh.wikipedia.org/wiki/%E6%9D%A8%E8%BE%89%E4%B8%89%E8%A7%92%E5%BD%A2
作为一个逗逼……不小心让上次的斐波那契数列题的former
和later
走错片场于是……不用在意这些细节。
这道题目有点意思。
1.如果一个数是素数,则指出是素数,否则写出因数。
2.输入一个整数,显示所有小于等于该数的素数。
首先明确什么是素数再说,实际上概念我忘得差不多了:
質數,又称素数,指在大於1的自然数中,除了1和此整数自身外,無法被其他自然数整除的数(也可定義為只有1和本身两个因数的数)。
一道实例引起了关于scanf()
的一点特性的思考:
#include <stdio.h>
int main(void)
{
long num;
long sum = 0L;
int status;
printf("Please enter an integer to be summed. ");
printf("(q to quit): ");
status = scanf("%ld", &num);
while (status == 1)
{
sum = sum + num;
printf("Please enter next integer (q to quit):");
status = scanf("%ld", &num);
}
printf("Those integers sum to %ld.\n", sum);
return 0;
}
这里用到了:
status = scanf("%ld", &num);
while (status == 1)
很明显赋值是给num
的,那么status
拿来何用?看起来似乎如果输入字符与格式符号不符(不能用%ld
说明符读取),就会返回0,符合则返回1,这样就可以判断输入的是否是指定的格式了。
关于printf()
和scanf()
有个神奇的*
修饰符,他和通配其实没什么关系,而且printf
和scanf
的作用不一样,所以一个个来看吧。
#include <stdio.h>
int main(void)
{
unsigned width, precision;
int number = 256;
double weight = 242.5;
printf("What field width?\n");
scanf("%d", &width);
printf("The number is: %*d: \n", width, number);
printf("Now enter a width and a precision: \n");
scanf("%d %d", &width, &precision);
printf("Weight = %*.*f\n", width, precision, weight);
return 0;
}
题目:
for (i = 0;i < lim - 1 && (c = getchar()) != '\n' && c != EOF; ++i)
s[i] = c;
不用&&和||的条件下编写一个与上面的for循环语句等价的循环语句
题目看着不难,我当时就想着用while
和if
的结合就OK了吧,结果思路方向错了,我想先if
再while
可是这样就跳过了两个条件的重复利用,先while
再if
才是正解,正好答案中还有枚举型的出现,就码来研究了一下。
将字符串s(实际上是数字)转换为相应的整数型。
来看一下这个:
int atoi(char s[])
{
int i, n;
n = 0;
for (i = 0; s[i] >= '0' && s[i] <= '9'; ++i)
n = 10 * n + (s[i] - '0');
return n;
}
刚开始的时候没看懂为什么n = 10 * n + (s[i] - '0');
,然后就试着运行了一下,发现确实,如果输入56
的话,输出就是56
(但肯定改变了类型)
虽然还没有学到数组那个章节,可是根据前面所说的,字符串其实是字符分开储存成数组(最后有\0
[当然可以忽略NULL]),他字符一格格储存的,换句话说s[0] = 5; s[1] = 6;
差不多类似于这种,然后就好理解了。
关于'0'
可见:http://codesky.me/archives/c-variable-const-type.wind
这个函数貌似挺能让人接受的OTZ……功能与<string.h>
里的strlen()
功能一模一样
int strlen(char s[])
{
int i;
i = 0;
while (s[i] != '\0')
++i;
return i;
}
这种类型的代码我们已经屡见不鲜了吧