gpt4 book ai didi

c - 使用 C 识别等差

转载 作者:行者123 更新时间:2023-11-30 21:21:34 27 4
gpt4 key购买 nike

我是 C 语言和一般编程的新手。我正在尝试用 C 编写一段代码,从名为“data.txt”的文件中读取数字列表(形式为 100.000000、200.000000、30000.000002 等)。然后它计算列表中所有可能数字之间的所有可能差异。该列表使得多组数字可能出现相同的差异。

例如,假设“data.txt”包含以下数字列表:

100.000000
200.000000
300.000000
400.000000
500.000000

在此列表中,100 的差异出现在:(200-100)、(300-200)、(400-300)、(500-400) 中。同样,差异 200 出现在: (300-100) 中。 (400-200)、(500-300) 等

代码需要识别这种等差并打印等差以及它们相等的组。

我写的代码是:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

int main(){
clock_t start, end;
double time_used;
/*To measure execution time */
start = clock();
FILE* fp = fopen("data.txt", "r");
FILE* fu = fopen("output.txt","w");
FILE* fx = fopen("diffdata.txt","w");
int i,j,k,b;
int counter=0;
double a,MAX=0,MIN=0,temp;
double *arr=malloc(100000*sizeof(double));

//arr[10000],brr[10000],diff[10000],

for(i = 0; fscanf(fp, "%lf", &a) == 1; i++)
{
if( i == 10000 ) {
printf("File content too large\n");
fclose(fp);
return 1;
}
*(arr+i) = a;
}

double *arr2=malloc((i*i)*sizeof(double));
double *brr=malloc((i*i)*sizeof(double));
double *diff=malloc((i*i)*sizeof(double));

for(j=0;j<i-1;j++) {
for(k=j+1;k<i;k++) {
if((*(arr+j))<(*(arr+k))) {
temp=*(arr+k);
*(arr+k)=*(arr+j);
*(arr+j)=temp;
}
}
}


for(j=0;j<i-1;j++) {
for(k=j+1;k<i;k++) {
fprintf(fx,"%lf - %lf = %lf\n",*(arr+j),*(arr+k),((*(arr+j))-(*(arr+k))));
*(arr2+counter) = *(arr+j);
*(brr+counter) = *(arr+k);
*(diff+counter) = (*(arr+j)) - (*(arr+k));
counter++;
}
}

fclose(fx);
i=counter;
printf("\n counter is %d \n", counter);
fx = fopen("diffdata.txt","r");

/*while(counter>i)
{
fscanf(fx,"%lf - %lf = %lf\n", (arr+i),(brr+i),(diff+i));
i++;
}
*/

fprintf(fu,"DIFFERENCE Groups\n");
for(j=0;j<counter;j++) {
if(MAX<(*(diff+j))) {
MAX=*(diff+j);
}
if(MIN>*(diff+j)) {
MIN=*(diff+j);
}
}
a = MIN;
//printf("\n%lf min \n", a);
while(a<=MAX) {
b=0;
for(k=0;k<i;k++) {
if(*(diff+k)==a) {
b++;
}
}
if(b!=0) {
fprintf(fu,"%lf:\n",a);
b=0;
for(k=0;k<i;k++) {
if(*(diff+k)==a) {
b++;
fprintf(fu,"\tGroup %d : %lf - %lf\n",b,*(arr2+k),*(brr+k));
}
}
}
a=a+1.000000;
}

end = clock();
time_used = ((double) (end - start)) / CLOCKS_PER_SEC;

printf("\nThe time taken is %f seconds.\n", time_used);

return 0;
}

问题是,我的代码仅检测整数差异,而忽略小数差异。

例如,如果我的“data.txt”文件具有以下输入数字列表:

100.000000
100.500000
200.000000
200.500000

那么所需的“output.txt”文件仅包含差异 100,出现在组 (200-100) 和 (200.5000000-100.500000)

但是 (100.5000000 - 100.000000) 和 (200.5000000 - 200.0000000) 出现的差异 0.500000 丢失了!

我不知道为什么。谁能帮帮我吗?

最佳答案

以下是我认为您问题的根源:

  1. 计算 min 时,您计算错误,该值被初始化为 0。
  2. 然后,您可以通过将 min 增加 1.0 来迭代所有差异。
  3. 因此,您只需测试通过将 1.0 添加到 0 即可找到的增量。
  4. 这不包括像 100.5 这样的增量。

请注意,即使您将增量更改为 0.1,由于浮点不准确,该方法仍然存在重大问题。

关于c - 使用 C 识别等差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24844288/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com