C语言/C++常见习题问答集锦(四十五) 之数字之谜
程序之美
1、最大公约数
题目描述
给定N个正整数,求他们的最大公约数。
本题要求函数实现,接口如下:
int gcd_array(int num[], int size);
求大小为size的数组num的gcd。
输入:
输入有两行组成。
第一行是正整数N.(1<=N<=1000).
第二行是N个空格分开的正整数,值均小于2的31次方。
输出:
输出N个数的最大公约数。
样例输入:
3
12 18 24
样例输出:
6
int gcd_array(int num[], int size){
int g,j, max, flag = 1, k;
max = 0;
for(k = 0; k < size; k++){
if (num[k] > max)
{
max = k;
}
}
for (j = num[max]; j >= 0; j --)
{
flag = 1;
for (k = 0; k < size; k++)
{
if (num[k] % j != 0)
{
flag = 0;
break;
}
}
if (flag == 1)
{
g = j;
break;
}
}
return g;
}
#include<stdio.h>
int main(){
int N, num[1000], gcd, i, size;
scanf("%d", &N);
size = N;
for (i = 0; i < N; i++)
{
scanf("%d", &num[i]);
}
gcd = gcd_array(num, size);
printf("%d\n", gcd);
return 0;
}
运行结果:
2、给定一个字符串,现在有q次询问,每一次询问给定一个区间,找到这个区间内出现最多的字符,若有多个出现最多的字符,输出ASCII码小的那一个。
输入
输入第一行一个字符串。
第二行一个整数q,代表有q次询问,每一次询问给定一个区间I和r
1<=len(s)<=104,1<=q<=104,1<=I<=r<=len(s),保证字符串只有小写字母构成。
输出:
对于每一次查询,输出一个答案代表区间内出现次数最多的字符
提示
字符串输入请用整行读入,不要一个字符一个字符读入
样例输入
aabcdeacfg
3
1 8
2 7
4 10
输出:
a
a
c
#include <stdio.h>
#include <stdbool.h>
int IsSame(char s[], int m, int n){
int i, max, ret;
int cnt[128]={0};//用来统计个数。
max = 0;
for(i = m - 1; s[i]!='\0' && i < n - 1; ++i)//遍历字符串。
{
cnt[s[i]]++;//统计个数。
if (cnt[s[i]] > max)
{
max = cnt[s[i]];
ret = i;
}
}
return ret;
}
int main()
{
char str[200];//存储字符串。
int n, s, e, i, v[512];
gets(str);//输入字符串。
printf("请输入区域个数:\n");
scanf("%d", &n);
if (n <= 0)
{
return;
}
for (i = 0; i < n; i++)
{
printf("请输入第%d组区域:\n", i + 1);
scanf("%d %d", &s, &e);
v[i] = IsSame(str, s, e);
}
printf("ASCII码小的字符分别为:\n");
for(i = 0; i < n; i++){
printf("%c\n", str[v[i]]);
}
getchar();
return 0;
}
运行结果为: