蓝桥杯精选:数的统计,阿尔法乘积,寂寞的数
2017-01-08 23:02
225 查看
START
数的统计:
![](https://img-blog.csdn.net/20170108223834150?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvQWxnZXJfamh1bg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
这道题是较简单,但同时也极具代表的一道题!
不多说先上代码~
#include "stdio.h"
int find(int *arr,int l,int n) //返回出现次数的函数
{
int i=0,k=0;
for(i=0;i<l;i++)
if(arr[i]==n) k++;
return k;
}
void sort(int *p,int n) //排序函数
{
int q,i,j;
for(j=0;j<n;j++)
for(i=0;i<n-j-1;i++)
if(*(p+i)>*(p+1+i)){
q=*(p+i);
*(p+i)=*(p+i+1);
*(p+i+1)=q;
}
}
int main()
{
int n,i,j,a[1000];
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
sort(a,n);
printf("%d %d\n",a[0],find(a,n,a[0])); //数组首位单独输出
for(i=1;i<n;i++)
if(a[i]!=a[i-1]) //一个数字及其出现次数只需输出一次
printf("%d %d\n",a[i],find(a,n,a[i]));
return 0;
}
该题大概思路就是先将数组排序(可以写个函数),然后输出,再写一个函数返回重复的次数(遍历数组),要注意的是首位要单独输出,因为下面的循环是从a[1]开始数。
阿尔法乘积:
![](https://img-blog.csdn.net/20170108224755133?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvQWxnZXJfamh1bg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
这题较为坑的地方在于输入的数可能远超int 的范围,所以可以采用数组来存储输入的数的方法,也可以使用long long int 的方法。
但这题我觉得利用递归是最简单的方法。
#include "stdio.h"
int alpha(long long int n)
{
if(n<10){
return n; //递归先设置出口(小于10的情况)
}else{
long long int a=1;
while(n){
if(n%10!=0){
a*=n%10;
n/=10;
}else n/=10;
}
return alpha(a); //若大于10 则递归
}
}
int main()
{
long long int n;
scanf("%I64d",&n);
printf("%d",alpha(n));
return 0;
}
寂寞的数:
![](https://img-blog.csdn.net/20170108225357141?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvQWxnZXJfamh1bg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
关于这个“生成元”的概念,要记住生成元一定大于原本的数就够,这道题的思路就是把每个数的生成元求出来,然后再对比原数,一一对比,若原数没有对应的生成元,就是所谓的“寂寞的数”
#include "stdio.h"
int sum(int i){ //求各个位数的和的函数
if(i > 9)
return i%10 + sum(i/10);
else
return i;
}
int main()
{
int n,i,j,a[10000],b[10000]={0}; //a数组用来存放生成元,b数组来标记那些非寂寞的数
scanf("%d",&n);
for(i=0;i<n;i++)
a[i]=i+sum(i);
for(i=0;i<n;i++){
for(j=0;j<n;j++)
if(i==a[j])
b[i]=1;
}
for(i=0;i<n;i++)
if(b[i]!=1)
printf("%d\n",i);
return 0;
}
这三道题都是蓝桥杯中较简单,适合新手拿来练手上门的习题。
END
数的统计:
这道题是较简单,但同时也极具代表的一道题!
不多说先上代码~
#include "stdio.h"
int find(int *arr,int l,int n) //返回出现次数的函数
{
int i=0,k=0;
for(i=0;i<l;i++)
if(arr[i]==n) k++;
return k;
}
void sort(int *p,int n) //排序函数
{
int q,i,j;
for(j=0;j<n;j++)
for(i=0;i<n-j-1;i++)
if(*(p+i)>*(p+1+i)){
q=*(p+i);
*(p+i)=*(p+i+1);
*(p+i+1)=q;
}
}
int main()
{
int n,i,j,a[1000];
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
sort(a,n);
printf("%d %d\n",a[0],find(a,n,a[0])); //数组首位单独输出
for(i=1;i<n;i++)
if(a[i]!=a[i-1]) //一个数字及其出现次数只需输出一次
printf("%d %d\n",a[i],find(a,n,a[i]));
return 0;
}
该题大概思路就是先将数组排序(可以写个函数),然后输出,再写一个函数返回重复的次数(遍历数组),要注意的是首位要单独输出,因为下面的循环是从a[1]开始数。
阿尔法乘积:
这题较为坑的地方在于输入的数可能远超int 的范围,所以可以采用数组来存储输入的数的方法,也可以使用long long int 的方法。
但这题我觉得利用递归是最简单的方法。
#include "stdio.h"
int alpha(long long int n)
{
if(n<10){
return n; //递归先设置出口(小于10的情况)
}else{
long long int a=1;
while(n){
if(n%10!=0){
a*=n%10;
n/=10;
}else n/=10;
}
return alpha(a); //若大于10 则递归
}
}
int main()
{
long long int n;
scanf("%I64d",&n);
printf("%d",alpha(n));
return 0;
}
寂寞的数:
关于这个“生成元”的概念,要记住生成元一定大于原本的数就够,这道题的思路就是把每个数的生成元求出来,然后再对比原数,一一对比,若原数没有对应的生成元,就是所谓的“寂寞的数”
#include "stdio.h"
int sum(int i){ //求各个位数的和的函数
if(i > 9)
return i%10 + sum(i/10);
else
return i;
}
int main()
{
int n,i,j,a[10000],b[10000]={0}; //a数组用来存放生成元,b数组来标记那些非寂寞的数
scanf("%d",&n);
for(i=0;i<n;i++)
a[i]=i+sum(i);
for(i=0;i<n;i++){
for(j=0;j<n;j++)
if(i==a[j])
b[i]=1;
}
for(i=0;i<n;i++)
if(b[i]!=1)
printf("%d\n",i);
return 0;
}
这三道题都是蓝桥杯中较简单,适合新手拿来练手上门的习题。
END
相关文章推荐
- 蓝桥杯 ALGO-104 算法训练 阿尔法乘积
- 蓝桥杯 ALGO-104 算法训练 阿尔法乘积
- 蓝桥杯 算法训练VIP 阿尔法乘积(Java解题)
- 蓝桥杯ALGO-104——算法训练 阿尔法乘积
- 蓝桥杯 ALGO-104 算法训练 阿尔法乘积
- 蓝桥杯 算法训练 阿尔法乘积
- 蓝桥杯 算法训练 阿尔法乘积
- 蓝桥杯 - 算法训练 阿尔法乘积 C语言实现
- 蓝桥杯 算法训练 阿尔法乘积
- 蓝桥杯 ALGO-104 阿尔法乘积(数学)
- 蓝桥杯算法提高 分数统计
- 2018 蓝桥杯 省赛 B组 原题 C语言B组 第8题 第九届蓝桥杯真题 日志统计
- 算法训练 阿尔法乘积
- 蓝桥杯 乘积最大
- 蓝桥杯 ALGO-88 算法训练 字串统计
- 蓝桥杯:最小乘积(基本型)
- 蓝桥杯-算法训练-ALGO-87 字串统计 Java实现
- C语言 · 阿尔法乘积
- 蓝桥杯 算法训练 字串统计
- 算法训练 阿尔法乘积