我必须编写一个程序,其中用户输入数字 n ,然后输入范围[1,n]中的 n +1个数字,其中一个这些数字中不止一次发生。程序返回多次出现的数字。
例如,如果输入是这样的:
3
1
2
3
2
then n = 3,其余输入为[1,3]范围内的四个数字,而输出为2
(因为该数字比一次)。
我不允许使用向量。
我认为我可以这样:
#include <stdio.h>
int main(){
int i,n,nr,x,num,aux,k;
scanf("%d", &n);
nr = 0;
for (i=0; i < n+1; i++)
{
scanf("%d", &num);
nr = nr * 10 + num;
}
k=1;
while(k!=2){
aux=nr%10;
nr=nr/10;
x=nr;
while (x>0){
x=x/2;
if (aux==x%10){
printf("Numarul este %d", aux);
k=2;
break;
}
}
}
return 0;
}
但这仅适用于一位数字,因为我要乘以10。如果我想支持更大的数字,我可以乘以更大的数字,但是nr
会变得太大。
所以:我如何支持大于10的数字?
答案 0 :(得分:2)
我知道我应该怎么做。从一开始就很简单,但认为很难。 如果我必须在[1,n]间隔中输入数字,并且有n + 1个数字,则它们的总和为n(n + 1)/ 2 +重复的数字。 “随机”一词杀死了我的大脑。 重复的数字(在我的老师的要求下,只有一个)等于总和,当您读取数字时,您会在循环中执行此操作,然后将数字总和从1减去n。 谢谢大家的回答,如果我的答案不清楚,请看下面的代码。
#include <stdio.h>
int main(){
int i, n, sum, nr, rep, k;
k=0;
sum=0;
scanf("%d", &n);
for (i=0; i<=n; i++){
scanf("%d", &nr);
if (nr>n){
k=1;
break;
}
sum = sum + nr;
}
if (k==1){
printf("Introduceti doar numere in intervalul 1, %d \n", n);
} else{
rep = sum - (n*(n+1))/2;
printf("Numarul %d se repeta\n", rep);
}
return 0;
}
答案 1 :(得分:1)
您可以在O(n)中执行此操作,而无需额外的空间或计数器。 您可以将访问次数修改为负数。如果数字为负数,则遍历时,则数字是重复的。
package config
import com.typesafe.config.ConfigFactory
object settings {
private val config=ConfigFactory.load()
object WebLogGen {
private val weblogGen = config.getConfig("clickstream")
lazy val records = weblogGen.getInt("records")
lazy val timeMultiplier = weblogGen.getInt("time_multiplier")
lazy val pages = weblogGen.getInt("pages")
lazy val visitors = weblogGen.getInt("visitors")
lazy val filepath = weblogGen.getString("file_path")
}
}
在您的示例中,
如果i = 0,则通过反转符号使该元素成为已访问元素;
void returnDuplicate(int[] arr)
{
int n = arr.length;
for(int i=0;i<n;i++)
{
if(arr[arr[i]-1]>0)
{
arr[arr[i]-1]= -arr[arr[i]-1];
}
else
{
print arr[i];
return;
}
}
}
答案 2 :(得分:0)
您需要由用户指定大小的数组并填充它:
int n;
scanf("%d", &n);
int a[n];
for (i=0; i < n; i++)
{
scanf("%d", &a[n]);
}
现在您需要遍历数组:
采用第一个元素
检查以下所有元素是否存在
如果是,就完成了
如果否,则取下一个元素,依此类推。
这听起来像是作业,我不会给您这个循环。用C编写起来应该很容易。