C Language Multiply Program wont work properly - c

My program gets a binary string ( up to 200 characters long) and then it multiplies it by a decimal number. The calculator works only for the first 2-3 iterations. After that it doesn't return the correct result. Any help ?
#include <stdio.h>
#include "myfun.c"
#include <string.h>
int main()
{
int l,l1;
char a[200],b[200],f[200];
int c[200],d[200];
for (i=0;i<200;i++)
{
c[i]=0;
d[i]=0;
}
gets(a);
l=strlen(a);
l1=strlen(a);
for (int i=0;i<l;i++)
{
c[200-l+i]=a[i]-48;
}
////////////////////////////////////////////
for (int i=0;i<l1;i++)
{
d[200-l1+i]=a[i]-48;
}
////////////////////////////////
for (int t=1;t<193;t++) //here is specify how many times i am multypling
bin_add(c,d);
for (i=0;i<200;i++){
printf("%d",c[i]);
}
return 0;
}
int bin_add(int c[200],int d[200])
{
int car[200]; //carry
i=200;
car[i]=0;
while (i >= 0) {
//find carry and shift it left
//find the sum
car[i-1] = c[i] & (d[i] |car[i]) ;
c[i]=(c[i]^d[i]) ^ car[i];
i--;
}
return c[i];
c[i]=0;
}

Related

i try to convert decimal to binary, when printing the reverse array, a random int appear at the top of the array

#include <stdio.h>
#include <iostream>
int main(){
int e[100];
int a,d;
int b = 0;
int c = 0;
int i = 0;
std::cin>>a;
while(a!=0)
{
d=a%2;
a=a/2;
e[i]=d;
i++;
if(d==1){
b++;
}
else if(d == 0){
c++;
}
}
while (i>=0)
{
printf("%d ",e[i]);
i--;
}
printf("%d ",e[i]);
std::cout<<"\nco "<<b<<" so 1 va "<<c<<" so 0\n";
return 0;
}
i try to convert decimal to binary, when printing the reverse array, a random int appear at the top of the array
original array](https://i.stack.imgur.com/OzUcj.png)
reverse array](https://i.stack.imgur.com/KSR6w.png)

the code here works perfectly in codeblocks but in codechef IDE it gives SIGTSTP (runtime error and shows a lot of 0s in the output)

LINK TO QUESTION : https://www.codechef.com/problems/LUCKFOUR
#include <stdio.h>
#include<stdlib.h>
int main() {
int T,ans;
scanf("%d",&T);
while(T) {
int num,count = 0;
scanf("%d",&num);
while(num) {
ans = num % 10;
num = num/10;
if( ans == 4) {
count++;
}
}
printf("%d\n",count);
T--;
}
return 0;
}
Runs normally for codeblocks:it takes T first and then takes input from the user and prints the no. of 4s in that input and repeats the process of taking inputs and printing out the no. of 4s T times
I did a little modification in your solution, and it passed. Just pay attention to the constraints, because sometimes int can cause an overflow. Take a look:
#include <stdio.h>
#include <stdlib.h>
int main() {
long long int T;
scanf("%lld", &T);
while(T--) {
long long int num, count=0;
int ans;
scanf("%lld",&num);
while(num) {
ans = num % 10;
num = num/10;
if( ans == 4) {
count++;
}
}
printf("%d\n",count);
}
return 0;
}
Submission image

Projecteuler 3 - largest prime number

I'm curious why this code doesn't find the largest prime factor.
I can't find the mathematic and/or logic mistake.
#include <stdio.h>
int compute( int input ) {
int biggest_primefactor = 1;
while(input > biggest_primefactor) {
int i = 2;
while(input%i != 0) i++; /* find factor, which is a primefactor */
input /= i;
if( i > biggest_primefactor) biggest_primefactor = i;
}
return biggest_primefactor;
}
void main () {
unsigned long long int input = 600851475143;
printf("%d", compute( input ));
}
Output is 1

How to remove the last comma in comma separated prime numbers within a range?

I have the code for finding prime numbers within a range.
The problem is to remove the last comma.
#include<stdio.h>
int main()
{
int a,b,i,x,c,f=1;
scanf("%d%d",&a,&b);
for(x=a;x<=b;(x++,f=0))
{
for(i=2;i<x;i++)
{
if(x%i==0)
{
f=1;
}
}
if(f==0)
printf("%d,",x);
}
}
But the output contains an extra comma in the last.
For example
2,3,5,7,
whereas the expected output is
2,3,5,7
Instead of flag you can decide directly what you want to print between numbers
And note that you can break out of the internal loop as soon as f is set to 1
#include<stdio.h>
int main()
{
int a,b,i,x,c,f=1;
const char* delim = "";
scanf("%d%d",&a,&b);
for(x=a; x<=b; (x++,f=0))
{
for(i=2; i<x; i++)
{
if(x%i==0)
{
f=1;
break; //no need to continue the checking
}
}
if(f==0) {
printf("%s%d",delim,x);
delim = ", ";
}
}
putchar('\n');
}
#include<stdio.h>
int main()
{
int a,b,i,x,c,f=1;
char backspace = 8;
scanf("%d%d",&a,&b);
for(x=a;x<=b;(x++,f=0))
{
for(i=2;i<x;i++)
{
if(x%i==0)
{
f=1;
}
}
if(f==0)
printf("%d,",x);
}
printf("\b"); // or printf("%c", backspace);
}
Add another flag, just a simple counter that tells you if you are printing the first time then check the flag to decide what to print, e.g.
#include<stdio.h>
int main()
{
int a,b,i,x,c,first=0,f=1;
scanf("%d%d",&a,&b);
for(x=a;x<=b;(x++,f=0))
{
for(i=2;i<x;i++)
{
if(x%i==0)
{
f=1;
}
}
if(f==0)
{
if(first==0){
printf("%d",x);
}else{
printf(",%d",x);
}
first++
}
}
}
Use a flag to detect the first occurrence of printf() and print the first number as such without any ,. For consecutive number printing precede with ,
#include<stdio.h>
int main()
{
int a,b,i,x,c,f=1,flag=0;//Flag to mark first occurrence
scanf("%d%d",&a,&b);
for(x=a;x<=b;(x++,f=0))
{
for(i=2;i<x;i++)
{
if(x%i==0)
{
f=1;
break;// Once the condition fails can break of the for loop as it fails for the prime number condition at the first case itself
}
}
if(f==0)
{
if(flag==0)
{//Check if it is first time
printf("%d",x);
flag = 1;//If so print without ',' and set the flag
}
else
printf(",%d",x);// On next consecutive prints it prints using ','
}
}
}
This method also avoids the , when only one number is printed.
Eg: When input is 2 and 4. It prints just 3 and not 3,
Simply you need odd number best practice for minimum loop is given below;
#include<stdio.h>
int main()
{
int a,b,i,x,c,f=1;
scanf("%d%d",&a,&b);
while (a < b)
{
if ( (a%2) == 1) {
printf("%d", a);
if ( (a + 1) < b && (a + 2) < b)
printf(",");
}
a = a + 1;
}
}
please check from the site
http://rextester.com/MWNVE38245
Store the result into a buffer and when done print the buffer:
#include <stdio.h>
#include <errno.h>
#define RESULT_MAX (42)
size_t get_primes(int * result, size_t result_size, int a, int b)
{
int i, x, f = 1;
size_t result_index = 0;
if (NULL == result) || (0 == result_size) || ((size_t) -1 == result_size))
{
errno = EINVAL;
return (size_t) -1;
}
for (x = a; x <= b; (x++, f = 0))
{
for (i = 2; i < x; i++)
{
if (x % i == 0)
{
f = 1;
break;
}
}
if (f == 0)
{
result[result_index] = x;
++result_index;
if (result_size <= result_index)
{
fprintf(stderr, "Result buffer full. Aborting ...\n");
break;
}
}
}
return result_index;
}
int main(void)
{
int a = 0, b = 0;
int result[RESULT_MAX];
scanf("%d%d", &a, &b);
{
size_t result_index = get_primes(result, RESULT_MAX, a, b);
if ((size_t) -1 == result_index)
{
perror("get_primes() failed");
}
else if (0 == result_index)
{
fprintf(stderr, "No primes found.\n");
}
else
{
printf("%d", result[0]);
for (size_t i = 1; i < result_index; ++i)
{
printf(", %d", result[i]);
}
}
}
return 0;
}
This example uses a simple fixed-size buffer, if this does not suite your needs replace it by a dynamic one.
This is more of a "language-agnostic" problem: "How do I output a comma-separated list without a final comma?" It is not specifically about prime numbers.
You seem to be thinking of you list as a series of [prime comma] units. It isn't. A better way to think of it is as a single prime as the head of the list, followed by a tail of repeated [comma prime] units.
Some pseudocode to illustrate the general idea:
outputList(theList)
separator = ", "
output(theList.firstItem())
while (theList.hasMoreItems())
output(separator)
output(theList.nextItem())
endwhile
return
/* this is just logic */
for(i=2;i<=n;i++)
{
k=0;
for(j=2;j<=i/2;j++)
{
if(i%j==0)
k=1;
}
if(k==0)
{
c++;
c++;
}
}
System.out.println(c);
for(i=2;i<=n;i++)
{
k=0;
for(j=2;j<=i/2;j++)
{
if(i%j==0)
k=1;
}
if(k==0)
{
System.out.print(i);
b++;
if(b!=c-1)
{
System.out.print(",");
b++;
}
}
}
}
}
//comma separated values
#include <bits/stdc++.h>
using namespace std;
int Prime(int a, int n){
bool prime[n+1];
memset(prime,true,sizeof(prime));
for(int p=2;p*p<=n;p++){
if(prime[p]==true){
for(int i=p*p ; i<=n; i+=p ){
prime[i] = false;
}
}
}
for(int i = 2;i<= n;i++){
if(i==2) cout<<i; // here is the logic first print 2 then for other numbers first print the comma then the values
else if(prime[i]) cout<<","<<i;
}
}
int main(){
int a =2 ;
int n = 30;
Prime(a , n);
}
#include <stdio.h>
int main()
{
int i, j, n, count;
scanf("%d", &n);
for(i=2; i<n; i++)
{
count=0;
for(j=2; j<n; j++)
{
if(i%j==0)
count++;
}
if(count==1)
printf("%d," i);
}
printf("\b \b");
}
\b is a nondestructive backspace. It moves the cursor backward, but doesn't erase what's there, it replaces it. For a a destructive backspace,
use "\b \b" i.e. a backspace, a space, and another backspace.
This Program prints all the prime number up to given number with comma separated

Hailstone Sequence in C

I'm taking a course in C (it's my first week) and I need to write a program that prints out sequences of hailstone numbers.
I'm expected to build a function to do that.
The next number gets printed out but that's it. For example when I enter 58, I get 29. But I'd like to print out a whole sequence of 9 next numbers.
Please, if you could guide in the right direction, I'd be eternally grateful.
#include <stdio.h>
#include <stdlib.h>
int Hailstone (int n)
{
if (n % 2 == 0) {
return n /= 2;
}
else {
return n = 3 * n + 1;
}
return n;
}
int main (void)
{
int start, result;
printf("Input a number: ");
scanf("%d", &start);
result = Hailstone(start);
printf("%d\n", result);
return 0;
}
What you want is to iterate. You don't need the result variable; you just plug in the new value:
while (start > 1) {
start = Hailstone(start);
printf ("%d\n", start);
}
There's a bit more that could be improved, e.g. the return n; is unreachable and the assignments to n are useless:
int Hailstone (int n)
{
if (n % 2 == 0) {
return n / 2;
}
else {
return 3 * n + 1;
}
}
If you want to hand in a pro C version of Hailstone() you could even write it as
int Hailstone (int n)
{
return n % 2 ? 3 * n + 1 : n / 2;
}
see, in your program, you are trying to return only a single value to the main..Hence to print all the numbers just write a loop as below..
#include <stdio.h>
#include <string.h>
int Hailstone(int n)
{
if(n % 2 == 0) {
return n /=2;
}
else {
return n = (3 * n) + 1;
}
}
int main (void)
{
int start;
printf("Input a number: ");
scanf("%d", &start);
while(start!=1)
{
start = Hailstone(start);
printf("%d\n", start);
}
}

Resources