每日五题第二天
持之以恒
1.最大公约数与最小公倍数之和问题
解题思路:ab=最大公约数最小公倍数
#include<stdio.h>
int main()
{
int n, m;
scanf("%d %d", &n, &m);
if (n < m)
{
int t = n;
n = m;
m = t;
}
int p = m * n;
while (m != 0)
{
int r = n % m;
n = m;
m = r;
}
printf("%d", n + p / n);
return 0;
}
运行结果为:
2.[NOIP2015]金币问题
此题唯一需要注意的点则是n<=k应该写在外层for中,不必每次均在while中
#include<stdio.h>
int main()
{
int k = 0;
scanf("%d", &k);//天数
int i = 0, j = 0, n = 1, c = 0;//c:金币个数
for (i = 1; n <= k; i++)
for (j = 0; j < i; j++)
{
if (n > k)
break;
c += i;
n++;
}
printf("%d", c);
return 0;
}
运行结果为:
3.输入N个数字求和
在寻常的vs中,变长数组可能会报错,所以这里是采用的c99语言中的变长数组来解决问题
源码如下:
#include<stdio.h>
int main()
{
int N = 10, s = 0, i = 0;
int arr[10];//因为c语言不支持arr[n],所以博主用10来代替n
for (i = 0; i < 10; i++)
{
scanf("%d", &arr[i]);
s += arr[i];
}
printf("%d", s);
return 0;
}
运行结果为:
4.有序数组插入一个数
有很多同学在写for循环时习惯用++,但有时候–可能会比++更好用的,注意甄别
#include<stdio.h>
int main()
{
int i = 0, n, x, a[51];
scanf("%d%d", &n, &x);
for (i = 1; i <= n; i++)
scanf("%d", &a[i]);
for (i = n; i > 0; i--)
{
if (x > a[i])
{
a[i + 1] = x;
break;
}
else
{
a[i + 1] = a[i];
a[i] = x;//将与x比较的数后移,x占用原来位置
}
}
for (i = 1; i <= n + 1; i++)
printf("%d", a[i]);
return 0;
}
运行结果为:
5.序列中整数去重
话不多说上代码
#include<stdio.h>
int main()
{
int i, j, k, n, a[1000];
scanf("%d", &n);
for (i = 0; i < n; i++)
scanf("%d", &a[i]);
for(i=0;i<n;i++)
for (j = i + 1; j < n; j++)
{
if (a[i] == a[j])
{
for (k = j + 1; k < n; k++)
a[k - 1] = a[k];
n--;
j--;
}
}
for (i = 0; i < n; i++)
printf("%d ", a[i]);
return 0;
}
运行结果如下
今天五题结束咯,明天见