注册 登录
编程论坛 C语言论坛

新手学C ,还请各位高人指点

Wx2019 发布于 2019-08-30 19:08, 4006 次点击
网上看到一段代码,有些地方不理解,输入一个整数,判断是否有重复的数字。如下
#include<stdio.h>
int main()
{int x,x1,t,a[10]={0};
   
    scanf("%d",&x);
 x1=x;
 for(;x;x/=10)
 {
 
     t=x%10;
     printf("a[10]的值是%d\n",a[10]);//这段是我加上的,当循环到最后这个值为什么就是1???
  if(a[t])
      {
         
          printf("%d中%d重复了\n",x1,t); return 0;}
    else a[t]=1;
  }
 printf("%d中没有重复的数字\n",x1);
 return 0;
}
13 回复
#2
c小白23332019-08-30 20:00
首先 你定义的a[10]里面有十个空间
从a[0]到a[9]  a[10]超出了
你的意思应该是这样的
程序代码:

    int x, x1, t;
    int a[10] = { 0 };
    scanf_s("%d", &x);
    x1 = x;
    for (; x; x /= 10)
    {
        t = x % 10;
        printf("a[%d]的值是%d\n", t, a[t]);
        if (a[t])
        {
            printf("%d中%d重复了\n", x1, t);
            return 0;
        }
        else
            a[t] = 1;                            //当出现重复的数字  值为1  所以最后为1
    }
    printf("%d中没有重复的数字\n", x1);



[此贴子已经被作者于2019-8-30 20:02编辑过]

#3
云不喜2019-08-30 23:24
最后的值不一定要是1,只是用if(x)来判断的话,我们一般用1表示真即成立,0表示假即不成立。
楼主可以尝试把最后的1改为其它正数来检验。

[此贴子已经被作者于2019-8-30 23:25编辑过]

#4
zhaoxd2019-08-31 10:47
这个程序输入1122,它判断不出来啊,结果是2重复了,输入2211,它判断是1重复了
#5
Wx20192019-08-31 10:53
回复 3楼 云不喜
你说的没有错,a[t]的值是真或者假,我的描述也不很清楚。
今天重新模拟了下,终于搞懂了,关键的点在 else a[t] = 1 这句,这个意思就是重新给a[t]赋值了,t的值在0--9中变化,
每次循环,都会给数组中的0--9个中的其中一个元素赋值1 ,当下一次循环,遇到是1的直接打印重复的数字了。
谢谢回复!!


#6
Wx20192019-08-31 10:59
回复 2楼 c小白2333
t的值是变化的,最开始给数组a[10]全部赋值为0 ,所以第一次循环a[t],理论上会是0 ,就执行了else a[t] = 1这句,当下次循环时碰到t与上次相等时,if(a[t])这个就是1 ,为真,谢谢回复。
#7
Wx20192019-08-31 11:01
回复 4楼 zhaoxd
没有错,这个程序如果遇到两个或者两个以上的重复数字,它就不灵了。现在在想如何修改让它判断任意整数。
#8
zhaoxd2019-08-31 11:37
/*
    改了一下,不过重复显示了。。。 哪位还知道怎么改。。
 */

#include<stdio.h>
int main()
{
    int x,x1,t,a[10]={0};
    int k= 0;
   
    scanf("%d",&x);
     x1=x;
     for(;x;x/=10)
    {
     
        t=x%10;
        //printf("a%d的值是%d\n", t, a[t]);//这段是我加上的,当循环到最后这个值为什么就是1???
        if(a[t])
        {   
            k++;
            printf("%d中%d重复了\n",x1,t);
            /*
            return 0;//加return0;表示:程序不再继续向下执行,包括后面的printf.和后面的return0;都表示 结束执行
            */
        }
        else
        {
            a[t]=1;
        }
    }
    if(k== 0)
    {
        printf("%d中没有重复的数字\n",x1);
    }
     
     return 0;
}
#9
zhaoxd2019-08-31 12:07
/*
    这次不知道改的对不对。。。。
 */

#include<stdio.h>
int main()
{
    int x,x1,t,a[10]={0};
    int k= 0;
   
    scanf("%d",&x);
     x1=x;
     for(;x;x/=10)
    {
     
        t=x%10;
        //printf("a%d的值是%d\n", t, a[t]);//这段是我加上的,当循环到最后这个值为什么就是1???
        if(a[t])
        {   
            k++;
            if(a[t]< 2)
            {
                printf("%d中%d重复了\n",x1,t);
                a[t]++;
            }
            
            /*
            return 0;//加return0;表示:程序不再继续向下执行,包括后面的printf.和后面的return0;都表示 结束执行
            */
        }
        else
        {
            a[t]++;
        }
    }
    if(k== 0)
    {
        printf("%d中没有重复的数字\n",x1);
    }
     
     return 0;
}
#10
jyxiasf2019-09-03 17:05
#include<stdio.h>
int main()
{
    int x,x1,t,a[10]={0};
    int x2=1;
    scanf("%d",&x);
 x1=x;
  for(;x;x/=10)
 {
 
     t=x%10;
     a[t]=a[t]+1;
  }
  for(t=0;t<10;t++)
  {
  if(a[t]>1)
      {
         
          printf("%d中%d重复了%d 次\n",x1,t,a[t]);
          x2=2;
      }
  }
  
  if (x2=1)
     printf("%d中没有重复的数字\n",x1);
  return 0;
}
#11
bcbbcclbbc2019-09-03 18:17
回复 10楼 jyxiasf
最后的if(x=1)需要加两个等号。一个等号是赋值,两个等号才是判断是否相等。
#12
qc970012019-09-03 23:01
回复 4楼 zhaoxd
t = x % 10;


  这个求余就是从最后一个数字判断的!所以输入1122,输出2重复是正确的!
#13
zhouaichun2019-09-10 17:42
#include<stdio.h>
int main()
{
  int x,x1,t,a[10]={0};  //定义几个整型变量和一个10个元素的整型组并初始化为0.
  scanf("%d",&x);        //输入要检查的数据
  x1=x;                  //x1被赋值用于后面语句显示
  for(;x;x/=10)          //这条语句要注意的是在循环体执行一次之后才会执行x/=10
    {
     t=x%10;             //进行取余操作取出个位数
     printf("a[%d]的值是%d\n",t,a[t]);//用于显示以取出的个位数为下标的元素的值
     if(a[t])            //这个值只能是1或者0,用于判断所取出的个位数在之前是否出现过                        
       {
          printf("%d中%d重复了\n",x1,t);//为1时执行的语句
          return 0;
       }
     else
     a[t]=1;                             //为0时执行的语句
   }
 printf("%d中没有重复的数字\n",x1);
 return 0;
}
/*这个程序关键语句是a[t]=1,在初次执行时,由于数组被初始化为0,选择语句会执行a[t]=1
这条语句,数组中以t为下标的元素被赋1,当后面有t的值与此t值相同时,if(a[t])则为真,执行
 printf("%d中%d重复了\n",x1,t);return 0;这两条语句。*/
#14
bcbbcclbbc2019-09-11 09:24
有点搞不懂,判断一个整数是否有重复的数字(0-9)
可以先找出那些重复了,那些没重复,最后再整体判断输出结果就行了,
怎么感觉有几个程序是只要出现符合的条件就return 0;直接结束,有把握找到结果吗?
而且程序发出来之前不应该自己先编译运行一下吗?这样看程序都有些烦,怎么会解决问题。
1