Сумма чисел последовательности
В первых четырёх байтах входного файла задано число ? — количество чисел в последовательности
(1 <= ? <=10000). Далее заданы сами целые числа последовательности: ? штук
по 4 байта в каждом. Все числа по абсолютной величине не превышают 10^5.
Требуется найти сумму ? чисел последовательности и вывести её как 4-байтовое целое
число.
Весь ввод и вывод в данной задаче бинарный. В каждом конкретном тесте
все числа записаны с одинаковым порядком байтов: это может быть либо big-endian, либо
little-endian. Однако в разных тестах порядок байтов может быть разным. Выводить число
в ответ требуется с тем же порядком байтов, с которым заданы входные данные.
вот мой пример, но ничего не выводится вообще... В чем дело, подскажите пожалуйста
#include<stdio.h>
#include <math.h>
int main() {
FILE* input;
fopen_s(&input, "input.bin", "rb");
FILE* output;
fopen_s(&output, "output.bin", "wb");
int N;
scanf("%d", &N);
fread(&N, sizeof(int), 1, input);
fread(&S, sizeof(int), 1, input);
for(int i=0; i<N; i++){
int S = (int)(((double)S));
fwrite(&S, sizeof(int), 1, output);
return 0;
}
Ответы (1 шт):
Ой. Меня не туда занесло - не увидел, что файлы таки бинарные. Для бинарных все проще -
int needRev = 0;
unsigned int reverse(unsigned int s)
{
unsigned int a[4];
a[3] = s&0xFF;
a[2] = (s>>8)&0xFF;
a[1] = (s>>16)&0xFF;
a[0] = (s>>24)&0xFF;
return a[0] + (a[1] << 8) + (a[2] << 16) + (a[3] << 24);
}
int main(int argc, const char * argv[])
{
FILE * in = fopen("input.bin","rt");
unsigned int N;
fread(&N,4,1,in);
if (N > 10000) { needRev = 1; N = reverse(N); }
unsigned int sum = 0;
for(int i = 0; i < N; ++i)
{
unsigned int m;
fread(&m,4,1,in);
if (needRev) m = reverse(m);
sum += m;
}
FILE * out = fopen("output.bin","wt");
if (needRev) sum = reverse(sum);
fwrite(&sum,4,1,out);
fclose(in);
fclose(out);
}
Тем не менее старый ответ оставлю - на тот случай, если вам такая задача попадется для текстовых файлов...
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int needRev = 0;
unsigned int reverse(unsigned int s)
{
unsigned int a[4];
a[3] = s&0xFF;
a[2] = (s>>8)&0xFF;
a[1] = (s>>16)&0xFF;
a[0] = (s>>24)&0xFF;
return a[0] + (a[1] << 8) + (a[2] << 16) + (a[3] << 24);
}
unsigned int getint(FILE * f)
{
unsigned int s[4];
for(int i = 0; i < 4; ++i) fscanf(f,"%x",&s[i]);
unsigned int res = s[0] + (s[1] << 8) + (s[2] << 16) + (s[3] << 24);
return needRev ? reverse(res) : res;
}
int main(int argc, const char * argv[])
{
FILE * in = fopen("input.bin","rt");
unsigned int N = getint(in);
if (N > 10000) { needRev = 1; N = reverse(N); }
unsigned int sum = 0;
for(int i = 0; i < N; ++i)
sum += getint(in);
FILE * out = fopen("output.bin","wt");
unsigned int a[4];
a[3] = sum&0xFF;
a[2] = (sum>>8)&0xFF;
a[1] = (sum>>16)&0xFF;
a[0] = (sum>>24)&0xFF;
fprintf(out,"%02X %02X %02X %02X\n",
needRev ? a[0] : a[3],
needRev ? a[1] : a[2],
needRev ? a[2] : a[1],
needRev ? a[3] : a[0]);
fclose(in);
fclose(out);
}