题目来源:https://blog.csdn.net/fjinhao/article/details/46853171
##week 02
##2.0
#include
int main()
{
int a,b;
printf("请输入两个正整数:");
scanf("%d %d", &a, &b);
printf("%d + %d = %d\n", a, b, a+b);
printf("%d - %d = %d\n", a, b, a-b);
printf("%d * %d = %d\n", a, b, a*b);
printf("%d / %d = %d\n", a, b, a/b);
return 0;
}
***##2.1***厘米换算英尺英寸
#include
int main()
{
int a;
scanf("%d", &a);
double b = a/100.0/0.3048*12;
int c = (int)b;
printf("%d %d", c/12, c%12);
return 0;
}
更简略的程序(重新定义double变量为int时,会自动抛弃小数点及后面部分,无四舍五入)
#include
int main()
{
int cm;
scanf("%d", &cm);
double t = cm/100.0/0.3048;
int foot = t;
int inch = (t - foot)*12;
printf("%d %d\n", foot, inch);
return 0;
}
##2.2******然后是几点
#include
int main()
{
//首先将给定的时间间隔分离出小时与分钟,
int oldtime;
int t;
scanf("%d %d", &oldtime, &t);
int hour = t/60;
int min = t%60;
// 然后将其时间间隔转化成四位数表示的形式,与原来时间相加得到新时间
int pass =hour * 100 + min;
int newtime = oldtime + pass;
//由于可能出现分钟位超过六十的情况,因此将新时间的分钟,小时分离,对60整除,并对小时进位(or not),分钟减去进位(or not),再转化成四位数表示的形式
min = newtime%100;
hour = newtime/100;
int s = min/60;
hour += s;
min -= s*60;
newtime = hour*100 + min;
printf("%d", newtime);
return 0;
}
***scanf里忘记了加&***,调试了很久(哭o(╥﹏╥)o
另一种别人写的,和我的思路正好相反
`#include
int main()
{
int i, j, x = 0, y, z;
scanf("%d%d", &i, &j);
if(i >= 1000)
{
x = i / 1000;
y = (i % 1000) / 100;
z = (i %1000) %100;
}
else
{
y = i / 100;
z = i % 100;
}
int s = (10*x + y) * 60 + z;
int n = s + j;
i = n / 60 *100 + (n - ((n / 60 )* 60));
printf("%d", i);
return 0;
}`
时间:2019/3/9
##2.3******逆序的三位数
#include
int main()
{
int a;
scanf("%d", &a);
//将该三位数通过%和/的方式拆成三个数
int b,c,d;
b = a/100;
int m = a%100;
c = m/10;
d = m%10;
//组合成一个新的数
int newnum = d*100 + c*10 + b;
printf("%d", newnum);
return 0;
}
##2.4******BCD解密
由于不了解二进制,十进制,十六进制在电脑上的关系,因此题干难以理解!!!
老师给出的解答
#include
int main()
{
int a;
scanf("%d", &a);
printf("%x", a);
return 0;
}
当直接使用"%x"会直接将十进制的数以16进制形式输出,但是不会有16进制前面的那两个字符!
或者这样做:
#include
int main()
{
int a;
scanf("%d", &a);
int b = a/16*10 + a%16;
printf("%d", b);
return 0;
}
直接把十进制的数通过数学计算的形式转化成十六进制。
##3.0******超速判断
#include
int main()
{
int speed;
scanf("%d", &speed);
//判断是否超速并输出
if (speed > 60){
printf("Speed: %d - Speeding", speed);
}else{
printf("Speed: %d - OK", speed);
}
return 0;
}
##3.1******三天打鱼两天晒网
#include
int main()
{
int n;
scanf("%d", &n);
//除去5之后,得到剩下的余数
int t = n%5;
//判断与3的大小关系
if (t>=1 && t<=3){
printf("Fishing in day %d\n", n);
} else{
printf("Drying in day %d\n", n);
}
return 0;
}
##3.2*** 用天平找小球***
#include
int main()
{
int a,b,c;
scanf("%d %d %d", &a, &b, &c);
//只需比较是否相等,不用管大小关系,比较两次即可得出结论
if (a == b){
printf("C");
}else{
if (a == c){
printf("B");
} else{
printf("A");
}
}
return 0;
}
##3.3*** 12-24小时制***
#include
int main()
{
int hour, minute;
scanf("%d:%d", &hour, &minute);
//只需比较hour和12及0的关系,在这个基础上考虑减或不减12
if (hour>=0 && hour<12){
printf("%d:%d AM", hour, minute);
} else if (hour == 12){
printf("%d:%d PM", hour, minute);
}else{
printf("%d:%d PM", hour-12, minute);
}
return 0;
}
##3.4*** 成绩转换***
#include
int main()
{
int score;
scanf("%d",&score);
score /= 10;
switch (score){
case 10:
case 9:
printf("A");
break;
case 8:
printf("B");
break;
case 7:
printf("C");
break;
case 6:
printf("D");
break;
default:
printf("E");
}
return 0;
}
##4.0*** 求符合给定条件的整数集***
整了很久,原因是没弄清楚各层的关系,弄错了大括号!
#include
int main()
{
int a,b,c,s;
scanf("%d",&a);
b = a;
c = a;
s = a;
int t = a+3;
//三层嵌套,第二层和第三层需要if来使得a,b,c不等,注意在每个循环的末尾加上改变条件的表达式!
//输出时只需在a变化后加空行即可,
while(a<=t){
while(b<=t){
if (b!=a){
while (c<=t){
if (c!=a && c!=b){
printf("%d ", a*100+b*10+c);
}
c++;
}
}
b++;
c = s;
}
a++;
b=s;
printf("\n");
}
return 0;
}
##4.1*** 水仙花数***
时间花了很久才写出来!
#include
int main()
{
//tansfer为传入循环时代替的t的值
//digit是transfer的每位数的值
//u_n为传入循环时代替的N的变量,防止N被改变
//c是求和时每个位的N次方的值,sum即为各位n次方的和
int n,transfer,digit,u_n,c;
//min和max是n位数的区间端点值
int min=1, max =1;
scanf("%d", &n);
//q_n为计算N位数区间的循环时代替的n的值
int q_n=n;
while (q_n>1){
min *= 10;
max *= 10;
q_n--;
}
max = max*10 -1;
transfer = min;
int m;
int sum;
// printf("n=%d",n);
while (transfer<=max){
m=transfer;
sum = 0;
while (m>0){
digit = m%10;
c=1;
//循环求n次方
while(u_n>0){
c *= digit;
u_n--;
}
//求n次方之和
sum += c;
m = m/10;
u_n=n;
}
if (sum == transfer){
printf("%d\n", transfer);
}
transfer++;
}
return 0;
}
时间:2019/3/10
##4.2*** 打印九九口诀表***
#include
int main()
{
int n;
scanf("%d", &n);
//trans为循环内部代替n的变量,防止n被改变
//i,t均为循环内部的变量
int trans = n,i=1,t;
while (i<=n){
t=1;
//printf("i=%d, n=%d,t=%d\n",i,n,t);
while(t<=i){
printf("%d*%d=%d ", t,i,t*i);
t++;
}
i++;
//当i+1发生时,换行
printf("\n");
}
return 0;
}
##4.3*** 统计素数并求和***
#include
int main()
{
int M,N;
scanf("%d %d",&M,&N);
int count=0,sum=0;
int i=2;
int status = 1;//1表示为素数,0表示不是素数
//printf("M=%d,N=%d\n",M,N);
while(M<=N){
do
{
if(M%i == 0){
//printf("该数不是素数!");
status = 0;
break;
}else{
i++;
}
}while (i
##4.4*** 猜数字游戏***
注释的大部分为调试时加上的,调试的时间比较长是因为又忘记在scanf里面的变量前面加&,o(╥﹏╥)o
下次一定要注意注意注意注意!!!!!
#include
int main()
{
int number,i;
scanf("%d %d", &number, &i);
int x;//这个数为用户输入的数字
//printf("请输入一个数字:");
scanf("%d",&x);
int count=1;//用于和i比较
if (x<0){
printf("Game Over!");
}else{
while(x>0){
if (x>number){
printf("Too big\n");
}else if(x0){
//printf("Am I in this loop?\n");
scanf("%d",&x);
//printf("x=%d\n",x);
if (x<0){
//printf("I want to out of the loop.\n");
return 0;
}else{
//printf("I am in this loop!\n");
}
//printf("I am leaving?!\n");
}
//printf("I am out!");
}
count++;
if (count>i){
printf("Game Over!\n");
break;
}
scanf("%d",&x);
}
}
return 0;
}
时间:2019/3/11
##5.0*** 求序列前N项和***
在写的时候不小心看错了题目,导致浪费了太多时间!!!
#include
int main()
{
int N;
//scanf("%d", &N);
N = 20;
int i;
double sum=0.0;
double s, t=2.0,m=1.0,c;
//printf("original:t=%f,sum=%f\n",t,sum);
for(i=1;i<=N;i++){
s = t / m;
c=t;
t += m;
m=c;
sum += s;
//printf("s=%f,t=%f,sum=%f\n",s, t, sum);
}
printf("%.2f", sum);
return 0;
}
##5.1*** 约分最简分式***
#include
//辗转相除法确定最大公约数
int main()
{
int a,b;
scanf("%d/%d", &a, &b);
//a = 4; b=6;
int c = a, d = b;//代替a,b进入循环,防止a,b的值被改变
int t;
while(d != 0){
t = c%d;
c = d;
d = t;
}
//printf("%d/%d=%d/%d\n", a,b,a/c,b/c);
printf("%d/%d", a/c, b/c);
return 0;
}
##5.2*** 念数字***
#include
int main()
{
int number;
//scanf("%d",&number);
number = -600;
if (number < 0){
printf("fu ");
number *= -1;
}
//得到number的(位数-1)*10
int t = number,mask = 1;
do{
t /= 10;
mask *= 10;
}while (t>9);
t = number;
//printf("mask=%d,t=%d\n",mask,t);
int i;
do{
i = t/mask;
//printf("i= %d\n",i);
switch (i){
case 0:
printf("ling");
break;
case 1:
printf("yi");
break;
case 2:
printf("er");
break;
case 3:
printf("san");
break;
case 4:
printf("si");
break;
case 5:
printf("wu");
break;
case 6:
printf("liu");
break;
case 7:
printf("qi");
break;
case 8:
printf("ba");
break;
case 9:
printf("jiu");
break;
}
if (mask >0){
printf(" ");
}
t %= mask;
//printf("\nt = %d\n",t);
mask /= 10;
}while (mask>0);
return 0;
}
##5.3*** 求a的连续和***
#include
int main()
{
int a,n,i;
scanf("%d %d", &a, &n);
int mul=0, sum = 0;
for( i=1 ; i<=n ; i++){
//printf("I am in the loop.\n");
mul = mul * 10 + a;
//printf("mul=%d", mul);
sum += mul;
//printf(" sum=%d\n",sum);
}
printf("%d", sum);
return 0;
}
##6.0 混合类型数据格式化输入
#include
/*
本题要求编写程序,顺序读入浮点数1、整数、字符、浮点数2,再按照字符、整数、浮点数1、浮点数2的顺序输出。
*/
int main()
{
int a;
double b,c;
char d;
scanf("%lf %d %c %lf", &b, &a, &d, &c);
printf("%c %d %.2f %.2f", d, a, b, c);
return 0;
}
##6.1简单计算器
没有思路,完全不知道怎么读入一个运算表达式!如果用char作为输入的话,发现太长会报warning,超过char的表达范围。
&忽略了题目的条件“四种运算符优先级相同”!
来自:https://blog.csdn.net/huozhiwu0424/article/details/37671693
c语言输入,每次scanf的读取数目与该语句内部的变量多少有关,如果小于输入的数目,则剩下的输入会被舍弃,但如果另写一句scanf,则可以继续读取第一个scanf读取完后的输入!
#include
int main()
{
int a,b;
char c;
scanf("%d", &a);
while(scanf("%c", &c)){
switch (c){
case '+': {scanf("%d", &b); a+=b; break;}
case '-': {scanf("%d", &b); a-=b; break;}
case '*': {scanf("%d", &b); a*=b; break;}
case '/': {scanf("%d", &b);
if(b == 0){
printf("ERROR\n");
return 0;
}else{
a/=b; break;
}
}
case '=': {printf("%d\n",a); return 0;}
default:{
printf("ERROR\n"); return 0;
}
}
}
return 0;
}
##6.2字符串字母大小写转换
了解了上一道题如何输入,这一道题会变得非常简单。
#include
/*
输入一个以#结束的字符串,本题要求将小写字母全部转换成大写字母,把大写字母全部转换成小写字母,其它字符不变。
*/
int main()
{
char a;
while(scanf("%c",&a)){
if (a>= 'A'&& a<= 'Z'){
a += 'a'-'A';
printf("%c", a);
}else if(a>='a' && a<= 'z'){
a += 'A'-'a';
printf("%c", a);
}else if(a == '#'){
break;
}else{
printf("%c",a);
}
}
return 0;
}
##6.3 单词长度
注意1.连续出现两个空格时,不能打印出count=0,必须跳过,读取下一个字符;
2.最后一个单词结尾必然没有空格,因此最后一个单词的字符数打印应该在break语句的前面;
3.空格问题,只需在打印最后一个单词时不加空格即可。
#include
int main()
{
char a;
int count=0,i=0;
while(scanf("%c", &a)){
if (a != '.'){
if (a != ' '){
count ++;
}else if(a == ' '){
if (count != 0){
printf("%d ",count);
count =0;
}
}
}else{
printf("%d",count);
break;
}
}
return 0;
##7.0 写出这个数
注意int表示的整数范围只在十位数,因此本题需用第六周习题里面的char类型读入,再根据ASCII将字符数字转化成整数。
念出这个数可根据前面的习题,创建一个函数,调用即可。
#include
void readnumber(int number);//函数原型
int main()
{
char n;
//scanf("%d", &n);
//n=1234567890987654321123456789;
int i;
int sum =0;
while(1){
scanf("%c", &n);
if (n == '\n'){
break;
}
i = (int)n -48;
sum += i;
}
//printf("%d\n",sum);
readnumber(sum);
return 0;
}
void readnumber(int number){
//int number;
//scanf("%d",&number);
//number = -3;
if (number < 0){
printf("fu ");
number *= -1;
}
//得到number的(位数-1)*10
int t = number,mask = 1;
do{
t /= 10;
mask *= 10;
}while (t>9);
t = number;
//printf("mask=%d,t=%d\n",mask,t);
int i,count=0;
do{
i = t/mask;
if (i!=0 || count !=0){
//printf("i= %d\n",i);
switch (i){
case 0:
printf("ling");
break;
case 1:
printf("yi");
break;
case 2:
printf("er");
break;
case 3:
printf("san");
break;
case 4:
printf("si");
break;
case 5:
printf("wu");
break;
case 6:
printf("liu");
break;
case 7:
printf("qi");
break;
case 8:
printf("ba");
break;
case 9:
printf("jiu");
break;
}
if (mask >0){
printf(" ");
}
}
t %= mask;
//printf("\nt = %d\n",t);
mask /= 10;
count++;
}while (mask>0);
}
##7.1换个格式输出整数
让我们用字母B来表示“百”、字母S表示“十”,用“12…n”来表示个位数字n(<10),换个格式来输出任一个不超过3位的正整数。例如234应该被输出为BBSSS1234,因为它有2个“百”、3个“十”、以及个位的4。
输入格式:每个测试输入包含1个测试用例,给出正整数n(<1000)。
输出格式:每个测试用例的输出占一行,用规定的格式输出n。
输入样例1:
234
输出样例1:
BBSSS1234
输入样例2:
23
输出样例2:
SS123
##7.1和7.2忘记保存了o(╥﹏╥)o
##7.3数素数
令Pi表示第i个素数。现任给两个正整数M <= N <= 104,请输出PM到PN的所有素数。
输入格式:
输入在一行中给出M和N,其间以空格分隔。
输出格式:
输出从PM到PN的所有素数,每10个数字占1行,其间以空格分隔,但行末不得有多余空格。
输入样例:
5 27
输出样例:
11 13 17 19 23 29 31 37 41 43
47 53 59 61 67 71 73 79 83 89
97 101 103
#include
int main()
{
int pm,pn;
scanf("%d %d", &pm, &pn);
int i,n=3;
int status=1,count =1,j=0;
while(count=pm){
printf("%d",n);
j++;
}
if (j<10 && j>0){
printf(" ");
}else{
printf("\n");
j = 0;
}
}
n++;
status =1;
}
return 0;
}
本题要求从输入的N个整数中查找给定的X。如果找到,输出X的位置(从0开始数);如果没有找到,输出“Not Found”。
输入格式:
输入在第1行中给出2个正整数N(<=20)和X,第2行给出N个整数。数字均不超过长整型,其间以空格分隔。
输出格式:
在一行中输出X的位置,或者“Not Found”。
输入样例1:
5 7
3 5 7 1 9
输出样例1:
2
输入样例2:
5 7
3 5 8 1 9
输出样例2:
Not Found
#include
int main()
{
int n,x;
scanf("%d %d",&n, &x);//n为一维数组的大小
int number[n];
int i,t,status=0;
for (i=0;i
#include
int main()
{
int n=10;//共十个数字,0~9
int s;
scanf("%d",&s);//s为给出的整数的个数
int number[3],a[n];
//对a[n]初始化
int i,j;
int temp,t;
for(i=0;i0){
t = number[i]%10;
a[t]++;
number[i] /= 10;
}
}
int b[n];
for (i=0;i b[i + 1]){
temp = b[i];
b[i] = b[i + 1];
b[i + 1] = temp;
}
}
}
printf("%d: ",b[n-1]);
for (i=0;i
最后的空格实在是不知道咋写进去,如果使用类似素数里面的状态参数判断,发现不成功
查看答案后,发现很简单,把空格移到前面就可以o(╥﹏╥)o
printf("%d:",b[n-1]);
for (i=0;i
同时里面也不需要使用冒泡算法,只需要找到最大值就可以了。
int max=0;
for (i=0;i
#include
/*
给定M行N列的整数矩阵A,如果A的非边界元素A[i][j]大于相邻的上下左右4个元素,那么就称元素A[i][j]是矩阵的局部极大值。
本题要求给定矩阵的全部局部极大值及其所在的位置。
*/
int main()
{
int row,col;
scanf("%d %d", &row, &col);
int matrix[row][col];
int i,j;
for (i=0;i matrix[i-1][j] && matrix[i][j] > matrix[i+1][j] &&
matrix[i][j] > matrix[i][j-1] && matrix[i][j] > matrix[i][j+1]){
printf("%d %d %d\n", matrix[i][j], i+1, j+1);
count ++;
}
}
}
if (count == 0){
printf("None %d %d", row,col);
}
return 0;
}
问题:1.当不确定数组大小时,读入什么条件结束读入
char ch;
while(ch != '\n'){
//进入循环,开始读入数组
}
2.如何将第一步寻找最小的数与之后的步骤写成一个大的循环
看完别人的代码,发现完全理解错了题意,测试用例看错了!!
以下代码来自:https://blog.csdn.net/phenixfate/article/details/42918685
#include
int main()
{
int array[10];
int i,n;
for(i=0;i<10;i++)
{
scanf("%d",&n);
array[i] = n;
}
for(i=1;i<10;i++) //输出第一个数
{
if(array[i]!=0)
{
printf("%d",i);
array[i] --;
break;
}
}
int j;
for(i=0;i<10;i++)
{
for(j=1;j<=array[i];j++)
printf("%d",i);
}
return 0;
}
##10.0说反话
发现自己不知道读入字符串如何结束读入,o(╥﹏╥)o,感觉自己好笨!
char s[100];
gets(s);
gets(s);//这里的函数是:读入字符串,只有在读到回车时才停止读入,空格正常读入!(所以也会和scanf一样有数组越界的风险)
scanf函数读入为读到空格,回车,tab为止
#include
#include
int main(int argc, const char* argv[])
{
char len[81];
gets(len);
int k = strlen(len);
char* p;
p = len + k;
//printf("%d",k);
while (1) {
if(*p == ' ' && *p+1 != ' ') {
*p = '\0';
printf("%s ", p+1);
}
if ( p == len){
printf("%s", p);
break;
}
p--;
}
return 0;
}
输入一个字符串S,再输入一个字符c,要求在字符串S中查找字符c。如果找不到则输出“Not found”;若找到则输出字符串S中从c开始的所有字符。
输入格式:
输入在第1行中给出一个不超过80个字符长度的、以回车结束的非空字符串;在第2行中给出一个字符。
输出格式:
在一行中按照题目要求输出结果。
输入样例1:
It is a black box
b
输出样例1:
black box
输入样例2:
It is a black box
B
输出样例2:
Not found
注意:1.C语言中,输出字符串的函数有两个:
puts():直接输出字符串,并且只能输出字符串。
printf():通过格式控制符 %s 输出字符串。除了字符串,printf() 还能输出其他类型的数据。
2.C语言中,输入字符串的函数有两个:
scanf():通过格式控制符 %s 输入字符串。除了字符串,scanf() 还能输入其他类型的数据。
注意scanf()读到空格,tab,回车结束,
gets():直接输入字符串,并且只能输入字符串。读到回车结束,读到空格不停止
gets(arrayName);参数是字符数组
#include
#include
int main(int argc, const char* argv[])
{
char len[81];
char c[2];
gets(len);
scanf("%s", c);
//
// printf("len=%s ", len);
// printf("%s\n",c);
//
char *p = strchr(len, c[0]);
if( p != NULL) {
printf("%s\n", p);
} else {
printf("Not found\n");
}
return 0;
}
发现自己指针没学明白,printf("%p",p)输出的是指针p的16进制地址,printf("%s",p)输出的是指针p指向的字符串。
输入2个字符串S1和S2,要求删除字符串S1中出现的所有子串S2,即结果字符串中不能包含S2。
输入格式:
输入在2行中分别给出不超过80个字符长度的、以回车结束的2个非空字符串,对应S1和S2。
输出格式:
在一行中输出删除字符串S1中出现的所有子串S2后的结果字符串。
输入样例:
Tomcat is a male ccatat
cat
输出样例:
Tom is a male
**没写出来,发现自己对字符数组,指针这块理解得不够透彻,很多语法都没写对!
#include
#include
int main(int argc, const char* argv[])
{
char s1[81], s2[81];
gets(s1);
gets(s2);
int i;
do{
char *p = strstr(s1,s2);
if (p){
for(i=0;i
3.21//
基本上C语言的学习就到此告一段落了,接下来应该要进行数据结构的学习了。
C语言学习时间:3.10-3.21,十一天有点长,太拖沓了!接下来的数据结构要认真快速地完成。