目录
C语言习题1.0
找一个数字的连续因子
设置两个循环,第一个是从哪开始找,第二个是向后找几个。从2开始向后找连续因子,一直到sqrt(a);
//找连续因子,及其个数
int main()
{
int a;
scanf("%d", &a);
int num = 0; //储存连续因子的个数
int min = 0; //储存连续因子的起始位置
int m;
//从i开始向后找连续因子
for(int i=2;i<sqrt(a);i++)
{
int t = a;
for (m = i; m < a; m++)
{
if (t % m == 0)
t /= m;
else
break;
}
if (m - i > num)
{
num = m - i;
min = i;
}
}
printf("%d\n", num);
for (int i = min; i < min + num - 1; i++)
printf("%d*", i);
printf("%d", min + num - 1);
return 0;
}
求N个分数的和
求N个分数的和,结果以整数和真分数的形式打印
此题关键在于对分子和分母的通分和化简上面。
//求N个分数的和
int gys(int x, int y)
{
int t = x % y;
while (t)
{
x = y;
y = t;
t = x % y;
}
return y;
}
int main()
{
int a, b;
int num;
scanf("%d", &num);//读取有几个分数
scanf("%d/%d", &a, &b);//先读取第一个分数
int fz = 0, fm = 0;
for (int i = 1; i < num; i++)
{
int c, d;
scanf("%d/%d", &c, &d); //读取第二个分数
//求两个分母的最大公因数
int gony = gys(b, d);
//求最小公倍数即分母
fm = b * d / gony;
//将分子通分
fz = a * fm / b + c * fm / d;
a = fz, b = fm;
}
//此时所有的分子和分母多完成相加了
//对分式进行化简,先找到最大公因数
int t = gys(fz, fm);
if (t)
{
fz /= t;
fm /= t;
}
if (fz % fm == 0) //能被整除
printf("%d\n", fz / fm);
else if (fz / fm == 0) //是一个真分式
printf("%d/%d\n", fz, fm);
else //是一个假分数
printf("%d %d/%d", fz / fm, fz%fm, fm);
return 0;
}
正整数A+B
1)判断是否是有效数字;2)记录A;3)判断完第一个数字后,找空格后的第二个数字,判断第二个是否为有效数字;4)记录B;5)输出结果。
//整数A+B
int main()
{
char put[500];
gets(put);
int m1 = 1; //用m1来记录数字是否有效
int m2 = 1;
int t1 = 0, t2 = 0; // 用t1和t2来保留数字
int j=0;
int num = strlen(put);
//查找第一个数字
for (int i = 0; i < num; i++)
{
if (put[i] == ' ')//如果等于空格
{
//首字符是空格则m1为0,即A为无效数字
if (i == 0)
{
m1 = 0;
}
j = i + 1; //第二个数字要从i+1开始查找
break;
}
else if (put[i] >= '0' && put[i] <= '9')
{
t1 = t1 * 10 + put[i] - '0';
}
else //其他情况就是包含无效字符,则A为无效数字
{
m1 = 0;
}
}
//查找第二个数字
for (int i = j; i < num; i++)
{
if (put[i] >= '0' && put[i] <= '9')
t2 = t2 * 10 + put[i] - '0';
else
{
m2 = 0;
break;
}
}
//打印
//先答应A
if (m1 == 0 || t1 < 1 || t1>1000)
printf("? + ");
else
printf("%d + ", t1);
//再打印B
if (m2 == 0 || t2 < 1 || t2>1000)
printf("? = ");
else
printf("%d = ", t2);
//打印结果
if ((m1 == 0 || t1 < 1 || t1>1000) || (m2 == 0 || t2 < 1 || t2>1000))
printf("?");
else
printf("%d", t1 + t2);
return 0;
}
递归
青蛙跳台阶问题
问题:有一只青蛙要跳上有n阶台阶的楼梯,青蛙一次可以跳1个台阶,也可以跳2个台阶,
问青蛙跳上去一共有多少种方法?
此题利用递归最直接,青蛙跳上n个台阶方法是F(n),则F(n)=F(n-1)+F(n-2),可以直接从倒数第二个台阶直接跳两步,也可以从倒数第一个台阶跳一步。注意:F(n-1)包含了从倒数第二个台阶跳2个1步的结果。
int FrogStep(int n)
{
if (n == 1)
return 1;
if (n == 2)
return 2;
return FrogStep(n - 1) + FrogStep(n - 2);
}
汉诺塔问题
有三个柱子A,B,C,要将A柱子上面的圆盘全部移到C上去,移动后还是大盘在小盘的下面。要求:每次移动后,不论是那一根柱子,都要满足大盘在小盘的下面。问:一共要移动多少次才能使盘子全部移动到C上买了去?
将A上面的N个盘子,看成两部分,最下面的大盘和最其余的N-1个盘子 ;先将N-1个全部移动到B上去,再将最大的移动到C上去;再将B上的n-1个全部移动到C上去。
F(n)=2*F(n-1)+1;
int HLT(int n)
{
if (n == 1)
return 1;
else
{
return 2*HLT(n - 1) + 1;
}
}
函数
(C语言)函数-优快云博客https://blog.youkuaiyun.com/2401_87944878/article/details/143407095
1)函数的定义可以放在任意位置,函数的声明必须放在函数使用之前;
2)自定义函数具有高内聚低耦性:函数与函数之间的联系应该尽量小,函数内应尽量少的使用全局变量;
3)使用指针访问的时候,char*一次访问一个字节,short*一次访问两个字节;
4)在打印的时候,%d一次读取四个字节;%lld和%llx等整形即%f,%lf一次读取8个字节;
5)C语言中一个变量可以被多次定义,在不同函数中;
6)将14.99四舍五入为15————printf("%.0f",14.99);
预处理
预处理详解-优快云博客https://blog.youkuaiyun.com/2401_87944878/article/details/143951068
1)#define宏定义;
2)#if,#ifdef,#ifndef,#else,#elif,除此之外还有#if defined ....的用法。都属于条件编译指令。#pragme是一个比较复杂的预编译指令;
3)ifndef,define,endif是用来解决同一文件重复包含相同文件的;
4)预处理只会处理#开头的语句,编译阶段只校验语法,链接时才会找实体。
文件处理
(C语言)文件操作-优快云博客https://blog.youkuaiyun.com/2401_87944878/article/details/143895631
1)文件名可以不包含后缀名,后缀名决定了文章的打开方式;
2)realloc函数可调整动态申请空间的大小,可大可小;
操作符
(C语言)操作符(全网最全,最详细)_c语言操作符大全-优快云博客https://blog.youkuaiyun.com/2401_87944878/article/details/143274246
1)用n|(n+1)来计算一个数二进制中0的个数,n&(n-1)来计算一个数中二进制中1的个数;
2)==的优先级比=高;
3)注意是传值还是传址;
4)new和delete成对使用,malloc和free成对使用;
5)字符常量用' ',字符串用'' '';
6)12a315156,在用%3d读取12a的时候,a是无效数字,不会被读取,但是也不会被舍去,会保留下来让下一个读取指令读取;
7)[ ]的优先级比*高;
8)getchar不像scanf一样,getchar会读取回车;