6个回答
展开全部
无重复四位数字,即各个数位数不重复,如1234等。类似于1123,或者4444,此类数字均不符合要求。
按照这个要求,对四位上的数字分别循环,当出现重复时不处理,无重复累加,遍历结束后输出结果即可。
代码如下:
int main()
{
int a,b,c,d,r=0;
for(a=1;a<10;a++)
{
for(b=0;b<10;b++)
{
if(b==a) continue;
for(c=0;c<10;c++)
{
if(c == a || c == b)continue;
for(d = 0; d<10;d++)
{
if(d == a || d==b || d==c) continue;
r++;
}
}
}
}
printf("共计有%d个\n", r);
}
运行输出:
共计有4536个
展开全部
(1)如果是不严格的4位数,范围就是0000~9999,
(2)如果是严格的4位数,范围就是1000~9999
(3)无重复的4严格位数,那就得判断了,假设4位数为abcd
第一位 a 可以取1~9,共9个数,假设为a
第二位 b 可以取0~9,但与a要不同,所以有9个数
第三位 c 可以取0~9,但与ab都不同,所以有8个数
第四位 d 可以取0~9,但与abc都不同,所以有7个数
综上,为9*9*8*7种
这是通过推断出来的,如果用程序实现的话,
就for 四位数 从1000到9999,再判断这四个数是否有重复位(判断四位数是否有数字重复的方法就是每次对10求余再除10),没有重复的话数量+1,
输出最终结果就OK了
bool judge(int num){
int d=num%10;
int c=(num/10)%10;
int b=(num/100)%10;
int a=num/1000; // 这个好像不用求余了
if(a!=b && a!=c && a!=d && b!=c && b!=d && c!=d) return true;
else return false;
}
int main(){
int i=0,cnt=0;
for(i=1000;i<9999;i++){
if(judge(i) ) cnt++;
}
printf("%d\n",cnt);
return 0;
}
(2)如果是严格的4位数,范围就是1000~9999
(3)无重复的4严格位数,那就得判断了,假设4位数为abcd
第一位 a 可以取1~9,共9个数,假设为a
第二位 b 可以取0~9,但与a要不同,所以有9个数
第三位 c 可以取0~9,但与ab都不同,所以有8个数
第四位 d 可以取0~9,但与abc都不同,所以有7个数
综上,为9*9*8*7种
这是通过推断出来的,如果用程序实现的话,
就for 四位数 从1000到9999,再判断这四个数是否有重复位(判断四位数是否有数字重复的方法就是每次对10求余再除10),没有重复的话数量+1,
输出最终结果就OK了
bool judge(int num){
int d=num%10;
int c=(num/10)%10;
int b=(num/100)%10;
int a=num/1000; // 这个好像不用求余了
if(a!=b && a!=c && a!=d && b!=c && b!=d && c!=d) return true;
else return false;
}
int main(){
int i=0,cnt=0;
for(i=1000;i<9999;i++){
if(judge(i) ) cnt++;
}
printf("%d\n",cnt);
return 0;
}
追问
亲,请问这个开头是不是还是要加上include?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2015-06-16
展开全部
1)因为最高位不能为 0 ,所以没有重复数字的四位数有 9*9*8*7=4536 个 ;
2)因为偶数的个位必为偶数,因此分两类:个位为 0 ;个位为 2 、4、6、8 ;
当个位为 0 时,有 1*9*8*7=504 个 ,
当个位为 2、4、6、8 时,有 4*8*8*7=1792 个 ,
因此偶数有 504+1792=2296 个 .
(也可以算出奇数有 5*8*8*7=2240 个,因此偶数有 4536-2240=2296 个)
2)因为偶数的个位必为偶数,因此分两类:个位为 0 ;个位为 2 、4、6、8 ;
当个位为 0 时,有 1*9*8*7=504 个 ,
当个位为 2、4、6、8 时,有 4*8*8*7=1792 个 ,
因此偶数有 504+1792=2296 个 .
(也可以算出奇数有 5*8*8*7=2240 个,因此偶数有 4536-2240=2296 个)
追问
谢谢,不过,能不能用c语言??编程
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
#include <stdio.h>
int result = 0;
void permutations_helper(bool[], int, int, bool);
// k为取几位数,这里的话就是4,如果取0位数,不存在,直接返回0
void permutations(bool D[], int k) {
if (k == 0) return;
permutations_helper(D, 0, k, true);
}
// start和end只是一个计数,代表已经取了头几位数,如果start == end说明找到了一个符
// 合要求的数; firstDigit代表是不是第一位,防止出现0在首位的错误
// D[i]: true表示可以取,false表示之前取过了,不能再取了
void permutations_helper(bool D[], int start, int end, bool firstDigit) {
if (start == end) {
++result;
return;
}
int i;
for (i = 0; i < 10; ++i) {
if (D[i] && (!firstDigit || i != 0 || start + 1 == end)) {
D[i] = false;
permutations_helper(D, start + 1, end, false);
D[i] = true;
}
}
}
int main() {
bool D[10];
int i;
for (i = 0; i < 10; ++i) D[i] = true;
permutations(D, 1);
printf("%d", result);
return 0;
}
int result = 0;
void permutations_helper(bool[], int, int, bool);
// k为取几位数,这里的话就是4,如果取0位数,不存在,直接返回0
void permutations(bool D[], int k) {
if (k == 0) return;
permutations_helper(D, 0, k, true);
}
// start和end只是一个计数,代表已经取了头几位数,如果start == end说明找到了一个符
// 合要求的数; firstDigit代表是不是第一位,防止出现0在首位的错误
// D[i]: true表示可以取,false表示之前取过了,不能再取了
void permutations_helper(bool D[], int start, int end, bool firstDigit) {
if (start == end) {
++result;
return;
}
int i;
for (i = 0; i < 10; ++i) {
if (D[i] && (!firstDigit || i != 0 || start + 1 == end)) {
D[i] = false;
permutations_helper(D, start + 1, end, false);
D[i] = true;
}
}
}
int main() {
bool D[10];
int i;
for (i = 0; i < 10; ++i) D[i] = true;
permutations(D, 1);
printf("%d", result);
return 0;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
//计算个数,并输出所有组合
void CopyArrayWithExcept(int a[], int nCount, int b[], int nExcept)
{
for(int i=0, j=0; i<nCount; i++)
{
if(i != nExcept)
{
b[j++] = a[i];
}
}
}
int GetXNumFromArray(int a[], int nArrayCount, int nGet, char* szPre)
{
if(nGet==1)
{
int nCount = 0;
for(int i=0; i<nArrayCount; i++)
{
printf("%s%d ", szPre, a[i]);
nCount++;
}
return nCount;
}
else
{
int nCount = 0;
for(int i=0; i<nArrayCount; i++)
{
if(strlen(szPre)==0 && (a[i]==0))
{
continue;
}
char szNewPre[20] = {0};
sprintf_s(szNewPre, "%s%d", szPre, a[i]);
int *nNewArray = new int[nArrayCount-1];
CopyArrayWithExcept(a, nArrayCount, nNewArray, i);
nCount += GetXNumFromArray(nNewArray, nArrayCount-1, nGet-1, szNewPre);
delete[] nNewArray;
}
return nCount;
}
}
int main(void)
{
int a[] ={0,1,2,3,4,5,6,7,8,9};
int nCount = GetXNumFromArray(a, 10, 4, "");
printf("\n%d", nCount);
return 0;
}
void CopyArrayWithExcept(int a[], int nCount, int b[], int nExcept)
{
for(int i=0, j=0; i<nCount; i++)
{
if(i != nExcept)
{
b[j++] = a[i];
}
}
}
int GetXNumFromArray(int a[], int nArrayCount, int nGet, char* szPre)
{
if(nGet==1)
{
int nCount = 0;
for(int i=0; i<nArrayCount; i++)
{
printf("%s%d ", szPre, a[i]);
nCount++;
}
return nCount;
}
else
{
int nCount = 0;
for(int i=0; i<nArrayCount; i++)
{
if(strlen(szPre)==0 && (a[i]==0))
{
continue;
}
char szNewPre[20] = {0};
sprintf_s(szNewPre, "%s%d", szPre, a[i]);
int *nNewArray = new int[nArrayCount-1];
CopyArrayWithExcept(a, nArrayCount, nNewArray, i);
nCount += GetXNumFromArray(nNewArray, nArrayCount-1, nGet-1, szNewPre);
delete[] nNewArray;
}
return nCount;
}
}
int main(void)
{
int a[] ={0,1,2,3,4,5,6,7,8,9};
int nCount = GetXNumFromArray(a, 10, 4, "");
printf("\n%d", nCount);
return 0;
}
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询