Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*usr/bin/gcc -g -lm -Wall -Wno-unused-function test.c -o test*/
- #include <stdio.h>
- #include <stdlib.h>
- #include <math.h>
- //count in base a/b
- int main(){
- int numer = 7; //a numerator
- int divis = 3; //b divisor
- long double base = (long double)numer/divis; //a/b
- int digits = 8; //n
- int decimals = 1; //k
- int pf[digits+decimals];
- for(int i=-decimals;i<digits;i++){ //can't have negative array index so offset by + decimals
- pf[i+decimals]=0;
- }
- while(pf[digits+decimals-1]==0){ //loop until most significant number gets a carry
- pf[0]++; //simply count 0 1 2 3... or ...-0.1, 0.0, 0.1...
- for(int i=-decimals;i<digits;i++){
- if(pf[i+decimals]>(numer-1)){ //carry
- pf[i+decimals]=0;
- pf[i+decimals+1]++;
- }
- }
- long double dec=0;
- for(int i=-decimals;i<digits;i++){
- dec += pf[i+decimals]*pow(base,i); //compute (a/b)^n + ... + (a/b)^0 + ... + (a/b)^-k
- }
- if(dec>170.666666 && dec<170.666667){ //search and print some range. quick and dirty programming
- for(int i=-decimals;i<digits;i++){//number
- int cindex = digits - i - 1;
- int curDigit=pf[cindex]; //current digit, most to least significant
- if(i==digits-decimals){printf(".");}
- curDigit+=curDigit<10 ? 48 : 97-10 ; //use ascii for anything past base 10
- printf("%c",(curDigit));
- }
- printf(" base (%d/%d)\n",numer,divis);
- int isFirst=1; //boolean to prevent + printing on first power
- for(int i=-decimals;i<digits;i++){//powers sum
- int cindex = digits - i - 1;
- int curDigit=pf[cindex]; //current digit, most to least significant
- if(curDigit==0){continue;} //skip zeros
- if(!isFirst){ printf(" + "); }else{ isFirst=0; } //isFirst?
- printf("%d*(%d/%d)^%d",curDigit,numer,divis,digits-1-i-decimals); //print (a/b)^n ... + (a/b)^-k
- }
- printf(" = %.11Lf (base 10)",dec);
- fflush(stdout);
- printf("\n");
- return 0;
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement