L1-033 出生年
分数 15
作者 陈越
单位 浙江大学
以上是新浪微博中一奇葩贴:“我出生于1988年,直到25岁才遇到4个数字都不相同的年份。”也就是说,直到2013年才达到“4个数字都不相同”的要求。本题请你根据要求,自动填充“我出生于y年,直到x岁才遇到n个数字都不相同的年份”这句话。
输入格式:
输入在一行中给出出生年份y和目标年份中不同数字的个数n,其中y在[1, 3000]之间,n可以是2、或3、或4。注意不足4位的年份要在前面补零,例如公元1年被认为是0001年,有2个不同的数字0和1。
输出格式:
根据输入,输出x和能达到要求的年份。数字间以1个空格分隔,行首尾不得有多余空格。年份要按4位输出。注意:所谓“n个数字都不相同”是指不同的数字正好是n个。如“2013”被视为满足“4位数字都不同”的条件,但不被视为满足2位或3位数字不同的条件。
输入样例1:
1988 4
输出样例1:
25 2013
输入样例2:
1 2
输出样例2:
0 0001
为什么我的代码不是满分,麻烦帮我指出一下问题在哪
#include
int main()
{
int y,n,count=0,x,a[10]={0},m;
int i;
scanf("%d%d",&y,&n);
while(1)
{
int t;
t=y;
for(i=0;i<4;i++)
{
a[t%10]++;
t=t/10;
}
m=0;
for(i=0;i<10;i++)
{
if(a[i]==1)
m++;
}
if(m+1==n)
{
printf("%d %04d",count,y);
break;
}
if(m==4)
{
printf("%d %04d",count,y);
break;
}
for(i=0;i<10;i++)
a[i]=0;
y++;
count++;
}
return 0;
}
23行的条件改为a[i]>=1;
27行的条件改为m==n;
34行到38行删掉。
修改前执行结果:
#include <stdio.h>
int main() {
int y, n, count = 0, a[10] = {0}, i, m, t;
scanf("%d%d", &y, &n);
while (1) {
t = y;
for (i = 0; i < 4; i++) {
a[t % 10]++;
t = t / 10;
}
m = 0;
for (i = 0; i < 10; i++) {
if (a[i] >= 1)
m++;
}
if (m == n) {
printf("%d %04d", count, y);
break;
}
for (i = 0; i < 10; i++)
a[i] = 0;
y++;
count++;
}
return 0;
}
这道题我是用了c++中#include"algorithm"库里面的
sort和unique函数,一个是排序,一个是去重(判断有几个不同的数字),一定要先排好序,再去去重,否则会出错,(我也不知道为什么,我之前没有加排序的那一行代码,就是错的,但是我逻辑上是说得通的)
#include<iostream>
#include<stdio.h>
#include<algorithm>//int index = unique(v.begin(),v.end) - v;
using namespace std;
int main()
{
int y,y_copy,begin,n;
int x;
int count = 0;
int num[4],num_copy[4];
cin>>y>>n;
begin = y_copy = y;
while(1)
{
for(int i=3;i>=0;i--)//将每个位取出来
{
if(y)
{
num_copy[i] = num[i] = y%10;
y = y/10;
}
else
num_copy[i] = num[i] = 0;
}
sort(num,num+4);
int index = unique(num,num+4) - num;//去重函数
// printf("index = %d num = ",index);
// for(int i=0;i<index;i++)
// printf("%d",num[i]);
// printf("\n");
if(index == n)//找到满足条件的年份
{
printf("%d ",y_copy - begin);
for(int i=0;i<4;i++)
printf("%d",num_copy[i]);
break;
}
y = ++y_copy; //下一个年份
}
return 0;
}
应该是限制范围出问题,
//应该要加入限制条件吧
//年份1-3000,n只能是 2/3/4
因为你的输入年份超过范围也照样处理,个人认为是这个问题
编程基础第六版 课后题
代码如下
#include <stdio.h>
#include <math.h>
int main()
{
int i,j,t;
int a[15];
int x,l,h,mid,n;
n=15;
l=0;
h=n-1;
printf("请输入15个不同数字,按一次输入一个,依次输入15次的方法输入数字:\n");
for(i=0;i<15;i++)
scanf("%d",&a[i]);
for(j=0;j<14;j++)
{
for(i=0;i<14-j;i++) //这里我第一次写也忽略了j要不断的去替换i,所以对于i来说它的循环条件应该是14-j,有好多人可能和我一样写成i<15啦
if( a[i]<a[i+1])
{
t=a[i];
a[i]=a[i+1];
a[i+1]=t;
}
}
printf("按从大到小的排序结果:");
for( i=0;i<15;i++)
printf("%d\t",a[i]);
printf("\n");
for (l=0, h=14, printf("请输入一个数:"), scanf("%d", &x); l<=h;)//while也可以但是我很奇怪用while会提前退出循环哈哈哈
{
mid=(l+h)%2;
if (x>a[mid])h=mid-1;
else if (x<a[mid])l=mid+1;
else
{
printf("%d是第%d位数",x,mid+1);
break;
}
}
if(x!=a[mid])
printf("查无此数!");
return 0;
}