开始编程
题目描述
【题目描述】
一个只由1 \sim m1∼m数码组成的nn位数, 如果任意两个相邻数之差的绝对值都不超过dd,则称这个数是一个"dd好数".
给出n,m,dn,m,d,输出nn位"dd好数"的个数. dd的值只可能取1,2,3.
输入格式
1行,3个正整数n,m,dn,m,d
输出格式
输出nn位"dd好数"的个数.
输入样例#1
输入样例#1
5 3 1
输出样例#1
99
开始编程
题目描述
【题目描述】
一个只由1 \sim m1∼m数码组成的nn位数, 如果任意两个相邻数之差的绝对值都不超过dd,则称这个数是一个"dd好数".
给出n,m,dn,m,d,输出nn位"dd好数"的个数. dd的值只可能取1,2,3.
输入格式
1行,3个正整数n,m,dn,m,d
输出格式
输出nn位"dd好数"的个数.
输入样例#1
输入样例#1
5 3 1
输出样例#1
99
我用的是C语言,写完才发现是c++。。。,不过思路都是一样的,只是输入输出需要修改
/*-----------------------------------------------
程序思路:
先确定最高位的值,再根据前一位确定后一位的值,一直递归,直至个位,
当到个位时说明这是一个“好数”,计数加一
-------------------------------------------------*/
#include<stdio.h>
int times=0;
void count(int num,int n,int m,int d);
void main()
{
int n,m,d;
int number1=0;
printf("位数:");
scanf("%d",&n);
printf("数码范围1~m:");
scanf("%d",&m);
printf("取值范围:");
scanf("%d",&d);
for(number1=1;number1<=m;number1++) //确定第一位数
{
count(number1,n-1,m,d); //确定下一位数
}
printf("d好数个数:%d\n",times);
}
void count(int num,int n,int m,int d)
{
int number2=num-d; //本位数字最小值为前一位减d
if(number2<1) //避免小于1
number2=1;
if(n>1) //如果未到个位,继续递归
{
for(;number2<=num+d&&number2<=m;number2++) //本位最大值为前一位加d且不能超过m
{
count(number2,n-1,m,d); //确定下一位数
}
}
else
{
for(;number2<=num+d&&number2<=m;number2++) //根据前一位确定个位数字的值,“好数”计数加1
{
times++;
}
}
return 0;
}