①. C循环控制
#include<stdio.h>
int main(){
unsigned char i = 7;
int j = 0;
for(;i > 0;i -= 3){
++j;
}
printf("%d\n", j);
return 0;
}
请问该程序的输出是多少(?)
A. 2
B.死循环
C. 173
D. 172
解析:
#include<stdio.h>
int main() {
unsigned char i = 7;
//unsigned char 的范围为0-255
int j = 0;
for (; i > 0; i -= 3) //要求i大于0,当i等于0时循环停止。所以我们就计算什么时候i等于0,这时j循环了多少次就可以了
{
++j;
}
//7 4 1 254~~~ 2 255~85
//3+84+1+85=173
printf("%d\n", j);
return 0;
}
②. 添加逗号
思路:
规定N的范围不能超过2,000,000,000,而整数int类型的最大范围是2,147,483,647 所以没有超过整形范围。
注意它说每三位加一个逗号,如果我们从前面每三位开始加逗号,可能会更加难以理解。所以我们应该是从后面开始每三个数加一个逗号。
而我们获取数字也是从低位开始获取,我们可以从低位获取数字后,每获取三个数字就加上一个逗号, 当数字全部获取完后,再将获取的数字倒过打印。
代码:
int main()
{
int n;
scanf("%d", &n);
char arr[14] = { 0 };//n的最大数是13位
int i = 0;
int k = 0;
while (n)
{
if (k % 3 == 0&&k!=0)//k是用来记录每获取三个数字后就加上一个逗号的标识
{
arr[i++] = ',';
}
//不断获取n的低位数字,然后把它变成数字字符放进数组里
arr[i++] = n % 10 + '0';//数字加'0'==数字字符 ---比如 8+'0'=='8'
//获得一个数字就给数组arr的下标+1
k++;
n /= 10;
}
//最后倒着打印数组
int j = 0;
for (j = i-1; j >= 0; j--)
{
printf("%c", arr[j]);
}
return 0;
}
③. 删除公共字符
思路:
要求输入两个字符串,输出字符串1中没有出现字符串2中的字符。
可以投机一下,并不是真正意义上的的删除
我们直接打印字符串1中没有出现字符串2中的字符就可以了。 如果字符串1中的字符与字符串2中的某个字符一样则不打印,如果全不一样则进行打印。
#include <string.h>
#include <assert.h>
int is_not_exist(char ch, char* str)
{
assert(str != NULL);
while (*str)
{
if (*str == ch)
{
return 0;//如果一样直接返回0,那if语句就不成立,就不要打印
}
str++;
}
return 1; //最后遍历完arr2后发现没有字符与arr1[i]一样,那就返回1,if语句为真,进行打印
}
int main()
{
char arr1[100] = { 0 };
char arr2[100] = { 0 };
//输入
gets(arr1);
gets(arr2);
int sz = strlen(arr1);
int i = 0;
//输出
for (i = 0; i < sz; i++)
{
if (is_not_exist(arr1[i],arr2))//如果该字符与arr2中所以字符都不一样那就可以打印,如果有一个一样那就不打印
{
printf("%c", arr1[i]);
}
}
return 0;
}
我们还可以利用库函数strchr
查找字符串中的字符,如果有则返回该字符所在的地址,如果没有则返回NULL.
int main()
{
char arr1[100] = { 0 };
char arr2[100] = { 0 };
//输入
gets(arr1);
gets(arr2);
int sz = strlen(arr1);
int i = 0;
//输出
for (i = 0; i < sz; i++)
{
//strchr--查找字符,查找一个字符串中是否有一个字符,如果有则返回第一次出现的地址,如果没有则返回NULL;
if (strchr(arr2, arr1[i])== NULL)//如果没有找到则返回NULL,也就可以打印了
{
printf("%c", arr1[i]);
}
}
return 0;
}