第1天:输入输出与运算(6题)
1001 害死人不偿命的(3n+1)猜想(基础运算)★
1006 换个格式输出整数(格式化输出)★
1016 部分A+B(数字提取)★★
1046 划拳(多输入处理)★★
1066 图像过滤(多条件输出)★★
1081 检查密码(输入验证)★★★
1001 害死人不偿命的(3n+1)猜想(基础运算)★
题目翻译:一个数如果是偶数就砍掉一半,反之如果是奇数,就3n+1再砍掉一半,需要砍几下才使最终结果为1
思路:设置计数器count记录砍几下,对于外层,需要用while循环来判断,条件是n!=1时,继续该循环,内层用if-else条件判断语句来处理偶数和奇数的条件
注意:
①3n+1写成3*n+1
②不能在while循环条件里面用两个if条件来判断,应该用if-else结构,原因是假设n为2时,第一个if语句将n变为了1,因为1为奇数,进入第二个if条件,(3*1+1)÷2为2,陷入了死循环,所以不能用(偶数在除以2后有机会会变为奇数,继续进入下一个if语句)
知识点:偶数的判断条件n%2==0,奇数的判断条件n%2==1
1006 换个格式输出整数(格式化输出)★
题目翻译:百位数字是几,就打印出几个B,十位数字是几,就打印出几个S,个位数字是n,就依次打印出从1到n
思路:想打印出B和S的数量,我们首先要知道百位和十位数字是什么,所以我们使用数字分解的方法,利用除法和余数的性质,分解百位十位个位的数字,接着用for循环将它们打印出来
个位的打印方法:先设置一个计数器,循环一次加1并打印一次,直到循环结束
知识点:一个数/10,除去最后一位(eg:100/10=10,999/10=99)
一个数%10得到最后一位(107%10=7)
1016 部分A+B(数字提取)★★
题目翻译:给定一个数,并给出DA,有多少DA,就打印多少次DA,得到PA
思路:想要知道一个数中有多少个DA,我们可以将这个数的所有数字进行分解并逐个逐个数字去和DA进行比对。
如何分解所有数字,可以利用循环加分解数字的方法
while(n>0)
{if(n%2==DA){countDA++;}
n/=2;
}
如何打印出相同的数字方法(如666,111)
int PA;
外层利用for循环,内层写PA=10*PA+DA
1046 划拳(多输入处理)★★
题目翻译:如甲或乙划出的数字等于两人喊出数字之和,则输者喝酒,若两人同赢或同输,则进入下一轮,问甲和乙各自喝酒的数量
思路:外层用for循环,内层用if语句进行判断,当甲胜乙败时,乙喝酒数加1,当乙胜甲败时,乙喝酒数加1,注意,在写if条件时,不能只写甲胜或乙胜,要排除二者都胜的情况
1066 图像过滤(多条件输出)★★
题目翻译:将灰度值在指定范围内的所有像素颜色用同一种颜色替代
思路:设置一个分辨率数组存储每行的灰度值,当灰度值位于给定的区间时,替换当前数组的值,最后按要求把数组的值输出来。
为什么要用数组?因为题目是每行给出N个灰度值进行输入,可以将灰度值存储起来进行替换,输出时可以将所有灰度值输出出来
输出思路:先输出每一行的第一个数,后输出空格+数字
1081 检查密码(输入验证)★★★
翻译题目:用户设置的密码需不少于6个字符,必须要有字母和数字,只能有字母,数字和小数点
思路:
设置一个字符串数组用来存储用户输入的密码
优先检查长度,用strlen函数来得到字符串的长度,因为如果密码太短,无论是否合法都报错,当长度出问题后,剩下的都不用检查,所以运用continue来跳过本行字符串的检查
当长度没有问题后,继续检查字符,字母和数字,因为是判断有无字母和数字,所以我们可以设置一个判断有无字母数字的变量进行检查,当有时则置为1
程序:此题注意点很多
#include<stdio.h>
#include<string.h>
int main()
{ //输入一个正整数N
int n=0;
scanf("%d",&n);
getchar(); // 吸收整数后的换行符
//设置字符串数组
char password[100]={"0"};//scanf会在空格处停止读取,导致密码被截断
//scanf不会读取换行符,所以移除换行符的代码是多余的
//用fgets读取整行
// fgets能正确处理包含空格的密码(例如"hello world")
//储存密码
for(int i=0;i<n;i++)
{
// scanf("%s",password);
//getchar();
fgets(password,sizeof(password),stdin);//读取整行
// 移除换行符
//正确的换行符处理避免密码被截断或包含多余字符
int len=strlen(password);
if(len>0&&password[len-1]=='\n')
{
password[len-1]='\0';
len--;
}
//检查长度
if(len<6)
{
printf("Your password is tai duan le.\n");
continue;
}
//设置是否存在数字变量
int shuzi=0;
//设置是否存在字符变量
int zifu=1;
// 设置是否存在字母变量
int zimu=0;
//判断是否存在字母
for(int j=0;j<len;j++)//使用j < len代替依赖于空字符的password[j]条件避免访问未定义内存区域
{
if((password[j]>='A'&&password[j]<='Z')||(password[j]>='a'&&password[j]<='z'))
{
zimu=1;
}
else if(password[j]>='0'&&password[j]<='9')
{
shuzi=1;
}
else if(password[j]!='.')
{
zifu=0;
break;
}
}
if(zifu==0)
{
printf("Your password is tai luan le.\n");
}
else if(zimu==0&&shuzi==1)
{
printf("Your password needs zi mu.\n");
}
else if(zimu==1&&shuzi==0)
{
printf("Your password needs shu zi.\n");
}
else
{
printf("Your password is wan mei.\n");
}
}
//判断是否存在数字
// 判断是否存在不合法字符
return 0;
}